用requests和bs4爬取B站‘编程’排名时遇到的问题
第一个问题,为什么图1中显示的href和'temp.a['href']'获得的href不一样,缺少‘&seid=16755155716233884618’。第二个问题,用open_url爬取问题一中提到的两个超链接时都会出错,经过测试发现是缺少“https:”这个前缀,添加后就可以正常爬虫,请问B站是用了什么反爬虫机制?
第三个问题,添加“https:”前缀后的网页链接正好等于图1中弹出来的小框框中的超链接,请问能否写代码直接获取弹出来框框中的网址?
import requests
import bs4
def open_url(url):
headers = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
res = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(res.text, 'html.parser')
return soup
res = open_url('https://search.bilibili.com/all?keyword=编程&order=totalrank&duration=0&tids_1=0')
temp = res.find('ul',class_ = 'video-list clearfix',type = 'video').contents
temp.a['href']
>>>'//www.bilibili.com/video/BV1xs411Q799?from=search'
javascript:; 本帖最后由 1q23w31 于 2020-7-29 08:08 编辑
第一个问题:以为后面的seid是通过js动态加整出来的,不是原始的html,
你把temp打印出来看一下就好
static/image/hrline/line6.png
第二个问题:https是网站传输的一种协议,任何链接都要有协议,这不属于反爬措施
static/image/hrline/line6.png
第三个问题:你可以人为在爬取的链接前加https:,就能直接得到完整链接
static/image/hrline/line6.png
import requests
import bs4
def open_url(url):
headers = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
res = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(res.text, 'html.parser')
return soup
res = open_url('https://search.bilibili.com/all?keyword=编程&order=totalrank&duration=0&tids_1=0')
temp = res.find('ul',class_ = 'video-list clearfix',type = 'video').contents
print('https:'+temp.a['href'])
原始HTML
页:
[1]