自动化爬取新闻页面

由于上次爬取的内容中,有一些图片本人访问是可以的,但是别人访问就是404 Nginx…等错误,所以需要重新爬取。今天的目标是人民网,人民网上也有一些昆虫类的题材。

难点:人民网的素材是动态加载的,众所周知动态加载的直接爬是爬不到源码的。

解决方法:使用自动化模拟用户访问,拿到源码,对源码再进行爬取分析整理。

过程分如下几步:

~获取网页源码的步骤

  1. 下载第三方库selenium
  2. 下载常用浏览器对应的驱动
  3. 模拟用户,等待刷新
  4. 获取当前界面源码
  5. 将源码保存在本地

~ 处理简单的网页源码步骤

  1. 把写好的请求头放上来
  2. 浏览合适的目标网址
  3. 对目标网址的源码进行分析
  4. 用BeautifulSoup进行爬取
  5. 整理成需要的json格式 [{键值对},{键值对}]
下载第三方库selenium

下载最新的selenium,在pythonCharm的命令行直接pip install selenium

下载常用浏览器对应的驱动

https://chromedriver.storage.googleapis.com/index.html

python爬虫跳转第二个页面点击_html

如上网址,根据自己的浏览器版本下载driver,直接下载win32版本的,因为向下兼容

下载后放到当前python.exe存放的位置

模拟用户,等待刷新
#使用驱动模拟用户
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
time.sleep(1)
获取当前界面源码

python爬虫跳转第二个页面点击_nginx_02

因为没有总页码,总页码也是加载的,这里需要自己手动设置,因为数据比较多,我需要的不多,所以设置成了10,自动化摸到源码后,隔一段时间控制下一页,对这10页的数据进行爬取

total_pages = 10 # 访问总页数
for page in range(1, total_pages + 1):
    page_result = []
    # 获取当前页面的源码
    pageSource = driver.page_source
    time.sleep(1)
    #对源码做持久化

    driver.find_element_by_css_selector(
        "#rmw-search > div > div:nth-child(2) > div.page-container > div > span.page-next").click()
    time.sleep(2)
将源码保存在本地

python爬虫跳转第二个页面点击_爬虫_03

#对源码做持久化
    with open("save_html" + str(page) + ".txt", "w+", encoding='utf-8') as f:
        f.write(pageSource)
    webSpider(page)#对持久化的数据进行离线爬取

下面的简单步骤就直接省了。

测试的时候最好是单独对一个离线数据进行测试,结果到达自己想要的之后,放入webSpider方法中

with open("save_html" + str(page) + ".txt", "r", encoding="utf-8") as f:
        st = f.readlines()
    html = ''
    for s in st:
        html += s
    # print(html)
    soup = BeautifulSoup(html, "lxml")
    div = soup.find("ul", class_="article")
    div_list = div.find_all("li")
    stt = '['
    for a in div_list:
        # print(a)
        href = a.find("a")["href"]
        # print(href)
        title = a.find("div", class_="ttl").find('a').text
        title = title.replace(u'\xa0', u'')

        if a.find("img") is None:
            img = None
        else:
            img = a.find("img")["src"]
        content = a.find("div", class_='abs').text
        content = content.replace(u'\xa0', u' ')

        date = a.find("span", class_="tip-pubtime").text
        fro = a.find("a", class_='tip-source').text
        dic = {"href": href,
               "Title": title,
               "banner": img,
               "Message": content,
               "CreatedAt": date,
               "fro": fro
               }
        # print(json.dumps(dic, ensure_ascii=False))
        stt += json.dumps(dic, ensure_ascii=False) + ",\n"
    stt = stt[:-2] + "]"
    with open("result_insect.txt", 'a+', encoding="utf-8") as f:
        f.write(stt)

lse) + “,\n”
stt = stt[:-2] + “]”
with open(“result_insect.txt”, ‘a+’, encoding=“utf-8”) as f:
f.write(stt)