一、爬虫的基本思路
- 打开网页: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\) 刷新
由于真实请求网址是一个静态网页,因此可以按照静态网页爬虫的方式爬取。
注:如果在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)
六、 网页检索和信息存储
(见示例)
标签:xpath,网页,python,text,爬虫,网络,html,requests,browser From: https://www.cnblogs.com/Easterlin/p/17301869.html