|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近在学习:分析Ajax请求并抓取今日头条街拍美图,视频链接:https://edu.hellobi.com/course/157/play/lesson/2578
遇到一些问题
关于爬取详情页的url这部分,按照步骤一步一步来,有几条url不对,打开是特卖广告,如下图1所示:
但是我怎么想也想不通,因为在索引页上面审查元素,然后查看data那一部分,里面的的确确就是20条记录,而且每一条的article_url都是正常的,如下图所示:
我尝试了增加头文件、代理访问,还是没有办法解决这个问题。然后我换了个时段去跑程序发现url显示正常,但是我爬取的20条url和网页上前20个url有些出入,大概有1/3是不一样的。我也是按照审查元素中显示的那样,提取data信息,然后进一步提取article_url这个步骤的,但是还是存在出入。
我的问题是:
1.为什么在爬取详情页的url时偶尔会遇到广告,而换个时段又正常了?
2.为什么我爬取的前20个详情页的url和网页上显示的前20个url不一样?
希望有高手能帮忙解答一下
另附上我的代码:
- from urllib.parse import urlencode
- import re
- from requests.exceptions import RequestException
- from bs4 import BeautifulSoup
- import requests
- import json
- def get_page_index(offset,keyword):#定义一个函数用于获取索引页信息
- data = {
- 'offset': offset,
- 'format': 'json',
- 'keyword': keyword,
- 'autoload': 'true',
- 'count': '20',
- 'cur_tab': '3'
- }
- # cur_tab为3指的是图集板块,数过来第三个,若为1则指代综合板块
- #count 数量
- url = 'http://www.toutiao.com/search_content/?' + urlencode(data) #urlencode可将字典对象转化为url的请求参数
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
- }
- try:
- response = requests.get(url,headers=headers)
- if response.status_code == 200:
- return response.text
- else:
- return None
- except RequestException:
- print('请求索引页出错')
- return None
- def parse_page_index(html):#定义一个函数解析索引页信息,返回一个包含详情页url的迭代器
- data = json.loads(html)#将字符串转化为一个对象(字典)
- if data and 'data' in data.keys():#判断data是否为空,同时要满足键里面有‘data’
- for item in data.get('data'):#获取字典中key为‘data’的对应的值,这个值data.get('data')为一个容量为20的列表,列表的元素为字典
- yield item.get('article_url')#获取字典中key为‘article_url’的对应的值,即网址
- def get_page_detail(url):#定义一个函数用于得到详情页下的信息
- try:
- response = requests.get(url)
- if response.status_code == 200:
- return response.text
- else:
- return None
- except RequestException:
- print('请求详情页出错')
- return None
- def parse_page_detail(html):#定义解析详情页的方法
- soup = BeautifulSoup(html,'lxml')
- title = soup.select('title')[0].get_text()
- print(title)
- '''
- image_pattern = re.compile('gallery: (.*?),\n siblingList',re.S)
- result = re.search(image_pattern,html)
- if result:
- print(result.group(1))
- '''
- def main():
- html = get_page_index('0','街拍')
- for url in parse_page_index(html):#parse_page_index(html)返回的是一个迭代器,每次输出一个网址
- print(url)
- html = get_page_detail(url)
- if html:
- parse_page_detail(html)
- #print(url)
- if __name__ == '__main__':
- main()
复制代码 |
-
|