Python爬虫-爬取百度搜索结果页的网页标题及其真实网址
共两个依赖的需提前安装的第三方库:requests和bs4库
cmd命令行输入安装requests库:pip3 install -i https://pypi.douban.com/simple requests
安装bs4库:pip3 install -i https://pypi.douban.com/simple beautifulsoup4
本微项目源文件下载地址:
https://wwuw.lanzouj.com/i1Au51a0312d
解压文件后,需按照解压包内教程装载Cookie即可使用。 本py脚本文件较符合有需求者使用,更适合python爬虫初学者学习使用,代码注释较多,思路易理解。
本py脚本文件使用教程:
首先解压压缩包,打开包内的 “运行py文件前请阅读!.txt” 文件,按其步骤装载Cookie后方可使用脚本:
运行该程序前:请打开浏览器前往"https://www.baidu.com"手动登录自己的百度账户,按F12打开开发者模式,选择最上面一排Network/网络选项卡。
接着按F5刷新本网页,捕获到的请求里一直往上翻到最顶端,选择第一次请求(即名称为www.baidu.com的请求)。
再选择右侧标头选项卡,往下滑到请求标头处,将Cookie字段的值全部复制下来(有很长一段的)替换掉下行的****** 替换后可直接运行该文件。
按上述步骤装载完Cookie后记得保存py脚本文件,就可以直接F5运行该脚本了。下图这里我用的是cmd控制台环境来跑脚本。
找到保存结果的BDlinks.csv文件后,可用WPS、微软Excel等软件直接打开。
如若该py脚本首次运行就失败,运行后无数据打印出来,一般是未成功装载Cookie的问题,请按开头的步骤重新装载Cookie。
如若该py脚本多次运行后突然无数据打印出来,一般是 “高频访问百度服务器/被识别爬虫” 导致无数据返回,通常解决方法为换新Cookie:浏览器F5刷新后继续按按开头的步骤重新装载Cookie。
最后可考虑是爬虫代码失效等其他问题,发文近日该爬虫仍有效。
本微项目源码:
1 import requests 2 from bs4 import BeautifulSoup 3 import re 4 import time 5 from random import choice 6 7 # 创建headers字段 8 def createUA(): 9 # 运行该程序前:请打开浏览器前往"https://www.baidu.com"手动登录自己的百度账户,按F12打开开发者模式,选择最上面一排Network/网络选项卡 10 # 接着按F5刷新本网页,捕获到的请求里一直往上翻到最顶端,选择第一次请求(即名称为www.baidu.com的请求)。 11 # 再选择右侧标头选项卡,往下滑到请求标头处,将Cookie字段的值全部复制下来(有很长一段的)替换掉下行的****** 替换后可直接运行该文件 12 ua = {'Cookie': '******', \ 13 'Host': 'www.baidu.com', \ 14 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54'} 15 return ua 16 # 程序运行无数据返回爬不了的时候,浏览器直接刷新继续按上述方法换字典里的Cookie值就完事了 17 18 # 将百度搜索链接给予的加密URL转化为真实的URL 19 def convertRealUrl(url, s2): 20 try: 21 headers = createUA() 22 realR = s2.get(url = url, headers = headers, allow_redirects = False) 23 # 当请求加密链接,初两次响应的Http报文往往告知浏览器需要重定向,最初两次的响应报文里才有Location属性来告知浏览器需要重定向到的真实网站链接。 24 # 此时我们不允许会话自动根据给出的Location重定向跳转,因为允许重定向后会自动跳到最新的真实的URL站点,这时就只返回最新站点的响应HTTP报文(已完成重定向后),此时响应标头里不再有指示重定向url的Location字段。此方法就会失效! 25 return realR.headers['Location'] 26 except: 27 # print(realR.status_code, end = "") 28 print("头部字段没有Location属性或者加密的url有异常") 29 return url# 如果找不到Location头部字段无法返回真实链接,那么就返回原来的加密链接 30 31 # 获取搜索页 32 def getSearchPage(keyword, pn, s1): 33 headers = createUA() 34 url = 'http://www.baidu.com/s' 35 payload = {'wd': keyword, 'pn': pn} 36 try: 37 r = s1.get(url, headers = headers, params = payload, timeout = 30) 38 print('状态码是:', r.status_code) 39 r.raise_for_status() 40 r.encoding = 'utf-8' 41 return r.text 42 except: 43 return "状态码异常" 44 45 # 升级!爬取一页的标题和真实链接 46 def upgradeCrawler(html, s2): 47 soup = BeautifulSoup(html, 'lxml') 48 titles = [] 49 links = [] 50 for h3 in soup.find_all('h3', {'class': re.compile('c-title t')}): 51 # a.text为获取该路径下所有子孙字符串吧。可能刚好a元素和em元素间没有换行符,所以抓取的字符串里没有\n换行符 52 g_title = h3.a.text.replace('\n', '').replace(',', ' ').strip()# 去掉换行和空格,部分标题中还有逗号会影响CSV格式存储,也要去除。 53 g_url = h3.a.attrs['href'] 54 g_url = convertRealUrl(g_url, s2) 55 print("{}\t{}\t".format(g_title, g_url)) 56 titles.append(g_title) 57 links.append(g_url) 58 return titles, links 59 60 # 将二维列表数据写入CSV文件 61 def writeCSV(titles, links): 62 infos = list(zip(titles, links)) 63 fo = open('./BDlinks.csv', 'at', encoding='utf-8')# 需要锁定用utf-8编码打开,不然该文件很可能会以gbk中文编码存储,这导致部分url中的西文字符存储到本文件时无法通过gbk模式编码存储。 64 for row in infos: 65 fo.write(",".join(row) + "\n") 66 fo.close() 67 print("CSV文件已保存!") 68 69 # 顶层设计 70 def main(): 71 while True: # 循环 72 keyword = input("请输入搜索关键词:") 73 num = int(input("请输入爬取页数:")) 74 titles = [] 75 links = [] 76 # s1会话用于获取搜索结果页 77 s1 = requests.session() 78 # s2会话用于转真实URL 79 s2 = requests.session() 80 # 第1页为0,第2页为10,第3页为20,依次类推 81 num = num * 10 82 for pn in range(0, num, 10): 83 html = getSearchPage(keyword, pn, s1) 84 print('标题\tURL\t') 85 ti, li = upgradeCrawler(html, s2) 86 titles += ti 87 links += li 88 print("{0:->41}{1:-<36.0f}".format("当前页码为:", pn / 10 + 1)) 89 time.sleep(5) 90 print('爬取完成!') 91 writeCSV(titles, links) 92 93 if __name__ == '__main__': 94 main()
有一小部分注释是作者开发学习过程中写的个人笔记,看不懂的还请跳过。
以上皆为原创内容,倘若本文对你有帮助的话还请点下下方的推荐和赞,你的鼓励就是作者创作的最大动力呀!
本文来自博客园,作者:onullo,转载请注明原文链接:https://www.cnblogs.com/onullo/p/17731811.html