bs4爬取汽车车闻网

107 阅读1分钟

爬取内容

image.png

1.导入包、库

import requests
from bs4 import BeautifulSoup

2.定义请求头

右键->>检查->>网络(network)->>F5刷新->>选名称第一个->>右边找到user-agent

headers = {
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
        }

3.定义url

一共有七千多页的内容,所以获取每页的url是关键。

image.png

得到每页的url,找规律:
https://www.autohome.com.cn/news/1/#liststart
https://www.autohome.com.cn/news/2/#liststart
https://www.autohome.com.cn/news/3/#liststart

获取每页的url(以前4页为例):

urls = []
for i in range(1,5):
    url = 'https://www.autohome.com.cn/news/{}/#liststart'.format(i)
    urls.append(url)

4.分析html页面,用bs4得到我们想要的信息

image.png

每一页所有的新闻在ul标签下,而每一条新闻都在一个li标签下;
新闻标题title在h3标签下;
发布时间timespan标签下;
发布简介profile在p标。

以上这些子标签都是在div标签下,先获得div标签:div标签较多,所以带上我们所需的标签属性class。 注意:class在python里是关键字,要想表达class属性,必须写为:class_

divs = soup.find_all('div',class_="article-wrapper")

下面我们就能获取每个信息了:

titles = div.find_all('h3')
times = list(div.find_all('span',class_="fn-left"))
profiles = list(div.find_all('p'))

5.遍历url,提取数据

解析器的选择:lxml HTML解析器 原因:1.速度快;2.文档容错能力强

news = []
for url in urls:
    try:
        response = requests.get(url,headers=headers)
        content = response.content.decode('gbk')
        #实例化一个BeautifulSoup对象
        soup = BeautifulSoup(content,'lxml')
        divs = soup.find_all('div',class_="article-wrapper")
        for div in divs:
            titles = div.find_all('h3')
            times = list(div.find_all('span',class_="fn-left"))
            profiles = list(div.find_all('p'))
            for title,time,profile in zip(titles,times,profiles):
                title = title.string
                time = time.string
                profile = profile.string
                car_news = {
                        "title":title,
                        "time":time,
                        "profile":profile,
                        }
                news.append(car_news)
    except:
        continue

这样我们就可以通过bs4获取到我们想要的信息了。

image.png