鱼C论坛

 找回密码
 立即注册
查看: 4242|回复: 1

分析Ajax请求并抓取今日头条街拍美图:爬取详情页的url与实际页面上显示不符

[复制链接]
发表于 2017-9-8 15:32:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在学习:分析Ajax请求并抓取今日头条街拍美图,视频链接:https://edu.hellobi.com/course/157/play/lesson/2578
遇到一些问题

关于爬取详情页的url这部分,按照步骤一步一步来,有几条url不对,打开是特卖广告,如下图1所示:
360截图20170908152747632.jpg
但是我怎么想也想不通,因为在索引页上面审查元素,然后查看data那一部分,里面的的确确就是20条记录,而且每一条的article_url都是正常的,如下图所示:
图2.jpg

我尝试了增加头文件、代理访问,还是没有办法解决这个问题。然后我换了个时段去跑程序发现url显示正常,但是我爬取的20条url和网页上前20个url有些出入,大概有1/3是不一样的。我也是按照审查元素中显示的那样,提取data信息,然后进一步提取article_url这个步骤的,但是还是存在出入。

我的问题是:
1.为什么在爬取详情页的url时偶尔会遇到广告,而换个时段又正常了?
2.为什么我爬取的前20个详情页的url和网页上显示的前20个url不一样?

希望有高手能帮忙解答一下

另附上我的代码:
  1. from urllib.parse import urlencode
  2. import re
  3. from requests.exceptions import RequestException
  4. from bs4 import BeautifulSoup
  5. import requests
  6. import json


  7. def get_page_index(offset,keyword):#定义一个函数用于获取索引页信息
  8.     data = {
  9.         'offset': offset,
  10.         'format': 'json',
  11.         'keyword': keyword,
  12.         'autoload': 'true',
  13.         'count': '20',
  14.         'cur_tab': '3'
  15.     }
  16.     # cur_tab为3指的是图集板块,数过来第三个,若为1则指代综合板块
  17.     #count 数量
  18.     url = 'http://www.toutiao.com/search_content/?' + urlencode(data) #urlencode可将字典对象转化为url的请求参数
  19.     headers = {
  20.         'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
  21.     }

  22.     try:
  23.         response = requests.get(url,headers=headers)
  24.         if response.status_code == 200:
  25.             return response.text
  26.         else:
  27.             return None
  28.     except RequestException:
  29.         print('请求索引页出错')
  30.         return None

  31. def parse_page_index(html):#定义一个函数解析索引页信息,返回一个包含详情页url的迭代器
  32.     data = json.loads(html)#将字符串转化为一个对象(字典)
  33.     if data and 'data' in data.keys():#判断data是否为空,同时要满足键里面有‘data’
  34.         for item in data.get('data'):#获取字典中key为‘data’的对应的值,这个值data.get('data')为一个容量为20的列表,列表的元素为字典
  35.             yield item.get('article_url')#获取字典中key为‘article_url’的对应的值,即网址

  36. def get_page_detail(url):#定义一个函数用于得到详情页下的信息
  37.     try:
  38.         response = requests.get(url)
  39.         if response.status_code == 200:
  40.             return response.text
  41.         else:
  42.             return None
  43.     except RequestException:
  44.         print('请求详情页出错')
  45.         return None

  46. def parse_page_detail(html):#定义解析详情页的方法
  47.     soup = BeautifulSoup(html,'lxml')
  48.     title = soup.select('title')[0].get_text()
  49.     print(title)
  50.     '''
  51.     image_pattern = re.compile('gallery: (.*?),\n    siblingList',re.S)
  52.     result = re.search(image_pattern,html)
  53.     if result:
  54.         print(result.group(1))
  55.         '''

  56. def main():
  57.     html = get_page_index('0','街拍')
  58.     for url in parse_page_index(html):#parse_page_index(html)返回的是一个迭代器,每次输出一个网址
  59.         print(url)
  60.         html = get_page_detail(url)
  61.         if html:
  62.             parse_page_detail(html)
  63.             #print(url)


  64. if __name__ == '__main__':
  65.     main()
复制代码
图1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-10-25 01:19:41 | 显示全部楼层
你好,我也正在学崔庆才的爬虫,希望能加个微信一起探讨探讨问题,我的微信是zhaf1113,万分期待
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-29 07:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表