在问答的一个版块, 如果有人发布了新的问题, 问答不会进行通知。
为了使更多提问者的问题能得到即时、快速的回答,编写了爬取问题标题程序,
用于在新问题发布时, 回答者能得到即时的通知。
1.下载页面
使用requests
库的get
方法即可, 注意添加headers
, 否则会爬取不到内容。
requests
库可使用pip
安装: pip install requests
。
from requests import get
from lxml.etree import HTML, tostring
headers = {
"User-Agent": """Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"""
}
url = "https://ask.csdn.net/ask"
req = get(url,headers=headers)
text=req.content.decode('utf-8')
2.解析XPath
首先创建lxml.etree
的HTML()
对象。
该对象的xpath()
方法会返回一个列表, 包含符合这个XPath的所有标签。
tree = HTML(text)
ques = tree.xpath('//*[@id="floor-ask-content-index_493"]/div/div/div[2]/div/div/div[1]/a/h2')
for q in ques:
print(q.text) # 打印出标题
3.自动通知新问题
程序使用2个列表, 分别是lst
, lst_new
保存爬取结果,
如果上一次爬取结果和本次不一致, 则输出本次爬取结果中新增加的问题。
最终的程序如下:
(源代码: gitcode.net/qfcy_/python/-/blob/master/WEB/爬取问题.py)
from requests import get
from lxml.etree import HTML, tostring
import time
def update(print_new = True):
global lst,lst_new
headers = {
"User-Agent": """Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"""
}
url = "https://ask.csdn.net/ask"
req = get(url,headers=headers)
text=req.content.decode('utf-8')
tree = HTML(text)
ques = tree.xpath('//*[@id="floor-ask-content-index_493"]/div/div/div[2]/div/div/div[1]/a/h2')
lst_new=[]
for q in ques:
lst_new.append(q.text)
if q.text not in lst and print_new:
print("新问题: ",q.text)
lst = lst_new.copy()
lst=[]
lst_new=[]
update(print_new = False) # 首次运行更新列表
time.sleep(5)
while True:
update()
time.sleep(8)