本程序需要提前安装的第三方库:requests和bs4库
cmd命令行输入安装requests库:pip3 install -i https://pypi.douban.com/simple requests
安装bs4库:pip3 install -i https://pypi.douban.com/simple beautifulsoup4
步骤:
1、接着按F5刷新本网页,捕获到的请求里一直往上翻到最顶端,选择第一次请求(即名称为www.baidu.com的请求)。

2、再选择右侧标头选项卡,往下滑到请求标头处,将Cookie字段的值全部复制下来(有很长一段的)替换掉下行的****** 替换后可直接运行该文件。



3、按上述步骤装载完Cookie后记得保存py脚本文件,就可以运行该脚本了。下图这里我用的是Vscode编译器来跑脚本。

4、找到保存结果的xxx.csv文件后,可用WPS、微软Excel等软件直接打开。

如若该py脚本首次运行就失败,运行后无数据打印出来,一般是未成功装载Cookie的问题,请按开头的步骤重新装载Cookie。
如若该py脚本多次运行后突然无数据打印出来,一般是 “高频访问百度服务器/被识别爬虫” 导致无数据返回,通常解决方法为换新Cookie:浏览器F5刷新后继续按按开头的步骤重新装载Cookie。
import requests
from bs4 import BeautifulSoup
import re
import time
from random import choice
import csv
def createUA():
ua = {'Cookie': '******', \
'Host': 'www.baidu.com', \
'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'}
return ua
# 将百度搜索链接给予的加密URL转化为真实的URL
def convertRealUrl(url, s2):
try:
headers = createUA()
realR = s2.get(url = url, headers = headers, allow_redirects = False)
# 当请求加密链接,初两次响应的Http报文往往告知浏览器需要重定向,最初两次的响应报文里才有Location属性来告知浏览器需要重定向到的真实网站链接。
# 此时我们不允许会话自动根据给出的Location重定向跳转,因为允许重定向后会自动跳到最新的真实的URL站点,这时就只返回最新站点的响应HTTP报文(已完成重定向后),此时响应标头里不再有指示重定向url的Location字段。此方法就会失效!
return realR.headers['Location']
except:
print("头部字段没有Location属性或者加密的url有异常")
return url
# 获取搜索页
def getSearchPage(keyword, pn, s1):
headers = createUA()
url = 'http://www.baidu.com/s'
payload = {'wd': keyword, 'pn': pn}
try:
r = s1.get(url, headers = headers, params = payload, timeout = 30)
print('状态码是:', r.status_code)
r.raise_for_status()
r.encoding = 'utf-8'
return r.text
except:
return "状态码异常"
# 升级!爬取一页的标题和真实链接
def upgradeCrawler(html, s2):
soup = BeautifulSoup(html, 'lxml')
titles = []
links = []
scname = []
for h3 in soup.find_all('h3', {'class': re.compile('c-title t')}):
# a.text为获取该路径下所有子孙字符串吧。可能刚好a元素和em元素间没有换行符,所以抓取的字符串里没有\n换行符
g_title = h3.a.text.replace('\n', '').replace(',', ' ').strip()
g_url = h3.a.attrs['href']
g_url = convertRealUrl(g_url, s2)
print("{}\t{}\t".format(g_title, g_url))
titles.append(g_title)
links.append(g_url)
result_list_0 = soup.find_all(class_='result c-container new-pmd')
result_list_1 = soup.find_all(class_='result c-container xpath-log new-pmd')
result_list = result_list_0 + result_list_1
for result in result_list:
try:
site = result.find(class_="c-color-gray").text
scname.append(site)
except:
site = ""
return titles, links, scname
# 将二维列表数据写入CSV文件
def writeCSV(scnames, titles, links):
infos = list(zip(scnames, titles, links))
filename = './xxx.csv' # 文件路径
try:
with open(filename, 'at', newline='') as csvfile:
writer = csv.writer(csvfile)
for row in infos:
writer.writerow(row)
print("CSV文件已保存到:", filename)
except Exception as e:
print("写入CSV文件时发生错误:", str(e))
def main():
while True:
keyword = input("请输入搜索关键词:")
num = int(input("请输入爬取页数:"))
titles = []
links = []
scnames = []
s1 = requests.session()
s2 = requests.session()
num = num * 10
for pn in range(0, num, 10):
html = getSearchPage(keyword, pn, s1)
print('标题\tURL\t')
ti, li, na = upgradeCrawler(html, s2)
titles += ti
links += li
scnames += na
print("{0:->41}{1:-<36.0f}".format("当前页码为:", pn / 10 + 1))
time.sleep(5)
print('爬取完成!')
writeCSV(scnames, titles, links)
if __name__ == '__main__':
main()
1095

被折叠的 条评论
为什么被折叠?



