python网络爬虫

发布时间 2023-04-10 09:56:41作者: Esterlin

一、爬虫的基本思路

  • 打开网页:requests / urllib
  • 找到需要的信息:标签 / xpath / jsonpath / ...
  • 获取和存储信息:json文档

二、网页的分类

1. 静态网页

源代码中包含需要的信息

国务院办公厅关于印发"十四五"国民健康规划的通知

爬取方式:直接从源代码中提取需要的信息

2. 动态网页

源代码无法直接获取需要的信息

中国日报-搜索

爬取方式:通过抓包的方式获取信息来源的真实链接


三、静态网页爬取

1、 导入需要的库

requests库用于访问网页,获取网页的html;etree库用于解析html文件,便于提取信息。

import requests #访问网页
from lxml import etree #格式化html

注:requests库和lxml库需要提前在命令行中安装。

pip install requests
pip install lxml

2、访问网页并获取源代码

url = "http://www.gov.cn/zhengce/content/2022-05/20/content_5691424.htm"

html = requests.get(url)
html.encoding=('utf-8')
html.text

3、 格式化html并提取需要的信息

1. etree格式化html

e = etree.HTML(html.text)

2. 获取目标信息的xpath

快捷键: ctrl+shift+c

标题的xpath:

/html/body/div[6]/div[3]/table[1]/tbody/tr/td/table[1]/tbody/tr[3]/td[2]

正文的xpath:

//*[@id="UCAP-CONTENT"]/p/span

3. 通过xpath提取信息

title = e.xpath("/html/body/div[6]/div[3]/table[1]/tbody/tr/td/table[1]/tbody/tr[3]/td[2]")
print(title[0].text)

content = e.xpath("//*[@id=\"UCAP-CONTENT\"]/p/span") # 注意引号前添加反斜杠
text = ''
for i in range(len(content)):
  text += content[i].text + '\n'
print(text)

四、 动态网页爬取

1、 抓包

中国日报-搜索为例

检查 \(\rightarrow\) 网络 \(\rightarrow\) Fetch/XHR \(\rightarrow\) 刷新

可以找到真实请求网址为:https://newssearch.chinadaily.com.cn/rest/en/search?keywords=carbon&sort=dp&page=0&curType=story&type=&channel=&source=

由于真实请求网址是一个静态网页,因此可以按照静态网页爬虫的方式爬取。

注:如果在Fetch/XHR中有多个请求网址,可以在右侧预览中找到请求的源代码,通过源代码中是否包含需要的信息判断该请求是否为真实请求。

2、 请求头参数

如果在抓包的过程中,真实网页无法直接访问或者出现异常,可以尝试在requests.get( )函数中添加请求头参数。(目前没遇到过相关的问题,仅作参考)

请求头参数的获取

检查 \(\rightarrow\) 网络 \(\rightarrow\) Fetch/XHR \(\rightarrow\) 标头 \(\rightarrow\) 请求标头

headers = {
    "Cookie":
    "wdcid=1183a2b961549484; ariaDefaultTheme=undefined; UM_distinctid=186a62056b0730-0985dbc61ace4a-26021151-e1000-186a62056b1859",
    "Host": "newssearch.chinadaily.com.cn",
    "Referer": "https://newssearch.chinadaily.com.cn/",
    "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}

html = requests.get(headers = headers,url = url)

五、 Selenium爬虫

优点:

  • 技术上较直接
  • 能够绕过反爬虫机制

缺点:

  • 爬虫效率低,耗时长

  • 网络环境要求高

from selenium import webdriver

# options = webdriver.ChromeOptions()
# options.add_argument('--headless')
# options.add_argument('--disable-gpu')
browser = webdriver.Chrome()
browser.maximize_window()
# 打开网页
url = 'https://r.cnki.net/kns/brief/result.aspx?dbprefix=gwkt'
browser.get(url)
# 选择专业搜索
adv_button = browser.find_element(by="xpath", value="//*[@id=\"1_2\"]/a")
adv_button.click()
# 输入关键词
keywords = "(QW = '碳' or QW = '大气污染' or QW = '化石燃料' or QW = '温室气体') and YE = '2001'"
text_box = browser.find_element(by="xpath", value="//*[@id=\"expertvalue\"]")
text_box.send_keys(keywords)
# 点击左侧加号
plus_key = browser.find_element(by="xpath", value="//*[@id=\"3first\"]")
plus_key.click()
# 选择省份
province_key = browser.find_element(by="xpath", value=f"//*[@id=\"3child\"]/dd[1]/a")
province = province_key.text
province_key.click()
# 爬取需要的信息
title = browser.find_elements(by="class name", value="s-title")
source = browser.find_elements(by="class name", value="s-gre")

print(title[0].text)

六、 网页检索和信息存储

(见示例)