爬虫百度百科要求验证,请问该如何处理?

image.png

爬虫要求验证,请问该如何处理?请赐教,不胜感激。

import urllib.request
import urllib.parse
from lxml import etree
import re
 
url = 'https://bke.bd.com/item/' + urllib.parse.quote('周杰伦')
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
req = urllib.request.Request(url=url, headers=headers, method='GET')
response = urllib.request.urlopen(req)
text = response.read().decode('utf-8')
print(text)
html = etree.HTML(text)
 
lt=[]
for i in range(1,6):
    sen_list = html.xpath(f"/html/body/div[3]/div[2]/div/div[1]/div[4]/div[{i}]//text()")
    l = [item.strip('\n') for item in sen_list]
    l=''.join(l)
    l=re.sub("\[+\d+\]","",l)
    lt.append(l)
for i in range(len(lt)):
    print(lt[i])

这种情况用梯子换ip能解决问题吗

回复
阅读 811
2 个回答

明显是特征被识别到了,换IP肯定是不能的,使用代理有可能够解决。模拟浏览器访问会好一些。

咋还没解决 😅 之前回复过应该是 TLS 特征被识别,还以为应该知道怎么解决了

pip install aiohttp

代码是你之前问题的代码改的

import urllib.parse
import asyncio
import aiohttp
from lxml import etree

async def query(content):
    # 请求地址
    url = 'https://baike.baidu.com/item/' + urllib.parse.quote(content)
    # 请求头部
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }
    async with aiohttp.ClientSession(headers=headers) as session:
        async with session.get(url) as response:
            text = await response.text()
            # 构造 _Element 对象
            html = etree.HTML(text)
            # 使用 xpath 匹配数据,得到匹配字符串列表
            sen_list = html.xpath('//div[contains(@class,"lemma-summary") or contains(@class,"lemmaWgt-lemmaSummary")]//text()')
            # 过滤数据,去掉空白
            sen_list_after_filter = [item.strip('\n') for item in sen_list]
            # 将字符串列表连成字符串并返回
            return ''.join(sen_list_after_filter)

async def main():
    while (True):
        content = input('查询词语:')
        result = await query(content)
        print("查询结果:%s" % result)

if __name__ == '__main__':
    asyncio.run(main())

image.png

原理就是 urllib.request 库对于 https 请求即 TLS 特征被识别

只需要换个不依赖 urllib.request 实现的请求库如 aiohttp


可参考

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏