上代码
import aiohttp
import asyncio
from lxml import etree
import aiofiles
import time
import random
'''aiohttp 和 asyncio 用于异步HTTP请求和事件循环。
lxml 用于解析HTML。
aiofiles 用于异步文件操作。
time 和 random 用于控制爬取速度。'''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate'
}
async def url(n, keyword, file_name):
async with aiohttp.ClientSession() as session:
#目录根据自己需求来
async with aiofiles.open(file_name, 'w', encoding='utf-8') as file:
count = 0
for i in range(n): # 通过for in来翻页
url = f'https://cn.bing.com/search?q={keyword}&first={i+1}&FORM=PERE'
try:
async with session.get(url, headers=headers) as resp:
r = await resp.text()
a = etree.HTML(r)
xpath = a.xpath('//*[@id="b_results"]/li/h2/a/@href') # 提取url连接
time.sleep(random.randint(1, 3))# 控制爬取速度
for i in xpath:
count += 1
await file.write(i + '\n' + '---------------------------------' + str(count) + '\n')
except Exception as e:
print('无法连接:', e)
'''该函数接受三个参数:n(要爬取的页数),keyword(搜索关键字),file_name(保存结果的文件名)。
使用 aiohttp.ClientSession 创建一个异步HTTP会话。
使用 aiofiles.open 异步打开文件进行写入。
通过 for 循环遍历要爬取的页数,构造每页的URL。
使用 session.get 发送异步HTTP请求,获取响应并解析HTML。
使用 etree.HTML 解析HTML,并通过XPath提取目标URL。
使用 time.sleep 和 random 控制爬取速度,避免被封IP。
将提取的URL写入文件,并记录提取的URL数量。'''
keyword = input('请输入要搜索的关键字:')
n = int(input('请输入要爬取的页数:'))
filename = input('请输入要保存的文件名:')
asyncio.run(url(n, keyword, filename))
使用的话,在该目录下cmd运行即可