'''
目标站点:云栖社区(https://yq.aliyun.com/)
需求数据:指定关键词的博文数据
需求:自动翻页并下载到本地
'''
关键:网页分析
我们收索关键字“爬虫”,然后获取到前3页的链接进行分析,发现spm和p的值不同
这时后我们发现q的值代表搜索关键字,p的值代表页数,spm不是很懂,通过百度搜索知道了spm是埋点用的,追踪用户访问页面的统计数据,用来做一些pv UV分析,idx的值为default,days的值为空,我们发现这三个值对搜索博文并不是很重要。
所以我们可以尝试着将spm、idx、days去掉,只通过q和p来控制
我们将url改为这样,发现可以成功获取到页面,分析正确😀
现在我们来获取总页数
我们发现在每页搜索框下有总的博文数据,然后每页15篇博文,👌这样我们就可以得出总的页数。
接下来,我们就可以写代码了😋,附上代码。
'''
目标站点:云栖社区(https://yq.aliyun.com/)
需求数据:指定关键词的博文数据
需求:自动翻页并下载到本地
'''
import requests
import re
key = "爬虫"
url = "https://yq.aliyun.com/search/articles/"
data = requests.get(url,params = {"q":key}).text
pat1 = '<div class="_search-info">找到(.*?)条关于'
nums = re.compile(pat1, re.S).findall(data)[0]
pages = int(nums)//15 + 1
for page in range(int(pages)):
index = str(page+1)
print("----正在爬取第" + index + "页----")
getdata = {"q": key,
"p": index
}
data = requests.get(url,params=getdata).text
pat_url = '<div class="media-body text-overflow">.*?<a href="(.*?)">'
articles = re.compile(pat_url, re.S).findall(data)
for article in articles:
thisurl = "https://yq.aliyun.com" + article
thisdata = requests.get(thisurl).text
pat_title = '<p class="hiddenTitle">(.*?)</p>'
pat_content = ' <div class="content-detail unsafe markdown-body">(.*?)</div>'
title = re.compile(pat_title, re.S).findall(thisdata)[0]
content = re.compile(pat_content, re.S).findall(thisdata)[0]
file = open("F:\\ProjectsCode\\python\\spiderfiles\\" + index + "_" + title + ".html", "w", encoding="utf-8")
file.write(title + "<br><br>" + content)
file.close()
新手上路,欢迎大佬来指点🙃