鱼C论坛

 找回密码
 立即注册
查看: 2692|回复: 5

[已解决]求助各位前辈,为什么我爬取网页信息时他不翻页呢?

[复制链接]
发表于 2020-7-13 10:45:13 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jjxx2005 于 2020-7-13 12:48 编辑
  1. import requests
  2. from lxml import etree
  3. UA = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'}
  4. url2 = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
  5. for i in range(1, 4):
  6.     data = {'__EVENTARGUMENT':i}
  7.     text1 = requests.get(url=url2, params=data,headers=UA).text
  8.     tree1 = etree.HTML(text1)
  9.     myname = tree1.xpath('//span[@class="con01"]/text()')
  10.     print(myname)
复制代码


我用
for i in range(1, 4):
    data = {'__EVENTARGUMENT':i}
获取的永远都是第1页

网页上有下一页  有什么简单又智能的方法让他自动查找下一页吗?
最佳答案
2020-7-13 14:22:40
网页点击的数据包有分析吗?你这问题就是因为少了提交的参数

提交方式是POST
111.png
总共提交了4个参数
2222.png

其中__VIEWSTATE和__VIEWSTATEGENERATOR这参数的值就在网页源码中,但经过分析只需提交__EVENTTARGET和__EVENTARGUMENT这两个参数就能正常获取信息。
444.png

  1. import requests
  2. from lxml import etree
  3. UA = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'}
  4. url2 = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
  5. for i in range(1, 4):
  6.     data = {
  7.         '__EVENTARGUMENT':i,
  8.         '__EVENTTARGET':'AspNetPager1'
  9.     }
  10.     text1 = requests.post(url=url2, data=data, headers=UA).text
  11.     tree1 = etree.HTML(text1)
  12.     myname = [x.strip() for x in tree1.xpath('//span[@class="con01"]/text()')]
  13.     print(myname)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-13 13:00:08 | 显示全部楼层
网上有人说可以通过点下一页,然后动态的去翻页,但是代码都太复杂了,有没有易懂的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 14:22:40 | 显示全部楼层    本楼为最佳答案   
网页点击的数据包有分析吗?你这问题就是因为少了提交的参数

提交方式是POST
111.png
总共提交了4个参数
2222.png

其中__VIEWSTATE和__VIEWSTATEGENERATOR这参数的值就在网页源码中,但经过分析只需提交__EVENTTARGET和__EVENTARGUMENT这两个参数就能正常获取信息。
444.png

  1. import requests
  2. from lxml import etree
  3. UA = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'}
  4. url2 = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
  5. for i in range(1, 4):
  6.     data = {
  7.         '__EVENTARGUMENT':i,
  8.         '__EVENTTARGET':'AspNetPager1'
  9.     }
  10.     text1 = requests.post(url=url2, data=data, headers=UA).text
  11.     tree1 = etree.HTML(text1)
  12.     myname = [x.strip() for x in tree1.xpath('//span[@class="con01"]/text()')]
  13.     print(myname)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
jjxx2005 + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-13 14:33:09 | 显示全部楼层
comeheres 发表于 2020-7-13 14:22
网页点击的数据包有分析吗?你这问题就是因为少了提交的参数

提交方式是POST

感谢回复,完全正确,还有一个问题,就是
for i in range(1, 4):
能不能写成动态的?就是这页有多少页就到多少页?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 14:33:46 | 显示全部楼层
本帖最后由 suchocolate 于 2020-7-13 14:40 编辑

post得用data=data方式,写在url里的其他参数采用params。
这个页面总共3页,查询的时候  '__VIEWSTATE','__EVENTARGUMENT' 都会变动,前者需要从当前页面获得,后者用for循环替代,又因为页面就3页,__EVENTARGUMENT就用2和3,所以range(2,4)

  1. # _*_ coding: utf-8 _*_


  2. import requests
  3. from lxml import etree


  4. def get_next_page_paramas(r):
  5.     html = etree.HTML(r.text)
  6.     params = html.xpath('//input[@type="hidden"]/@value')
  7.     return params


  8. def main():
  9.     global data
  10.     global headers
  11.     r = requests.get(url=url, headers=headers)
  12.     params = get_next_page_paramas(r)
  13.     data['__VIEWSTATE'] = params[0]
  14.     data['__VIEWSTATEGENERATOR'] = params[1]
  15.     for item in range(2, 4):
  16.         data['__EVENTARGUMENT'] = str(item)
  17.         r = requests.post(url=url, headers=headers, data=data)
  18.         html = etree.HTML(r.text)
  19.         result = html.xpath('//span[@class="con01"]/text()')
  20.         print(result)
  21.         data['__VIEWSTATE'] = get_next_page_paramas(r)[0]
  22.         print('='*100)


  23. if __name__ == '__main__':
  24.     data = {'__EVENTTARGET': 'AspNetPager1'}
  25.     headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'}
  26.     url = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
  27.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 16:53:44 | 显示全部楼层
jjxx2005 发表于 2020-7-13 14:33
感谢回复,完全正确,还有一个问题,就是
for i in range(1, 4):
能不能写成动态的?就是这页有多少页 ...

通过分析网页上“尾页”按钮所对应的href内容来确定
Snipaste_2020-07-13_16-52-34.png

批量获取每个区的页数
  1. import requests
  2. from lxml import etree
  3. import re
  4. UA = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'}

  5. r1 = requests.get(url='http://www.jkl.com.cn/cn/shop.aspx', headers=UA).text
  6. html1 = etree.HTML(r1)
  7. xlist = html1.xpath('//*[@id="form1"]/div[5]/div[1]/div/ul/li/a')
  8. for x in xlist:
  9.     id = x.xpath('@id')[0]
  10.     name = x.xpath('text()')[0].strip()
  11.     url = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=%s' % id

  12.     r2 = requests.get(url=url, headers=UA).text
  13.     html2 = etree.HTML(r2)
  14.     page = html2.xpath('//a[text()="尾页"]/@href')
  15.     if page != []:
  16.         result = re.search("(\d+)'\)", page[0])
  17.         total = result.group(1)
  18.     else:
  19.         total = 1
  20.     print('%s(%s)对应页数为:%s' % (name, url, total))

复制代码


结果输出为:
  1. 西城区(http://www.jkl.com.cn/cn/shopLis.aspx?id=862)对应页数为:1
  2. 朝阳区(http://www.jkl.com.cn/cn/shopLis.aspx?id=865)对应页数为:3
  3. 海淀区(http://www.jkl.com.cn/cn/shopLis.aspx?id=866)对应页数为:1
  4. 丰台区(http://www.jkl.com.cn/cn/shopLis.aspx?id=867)对应页数为:1
  5. 石景山区(http://www.jkl.com.cn/cn/shopLis.aspx?id=868)对应页数为:1
  6. 顺义区(http://www.jkl.com.cn/cn/shopLis.aspx?id=869)对应页数为:1
  7. 昌平区(http://www.jkl.com.cn/cn/shopLis.aspx?id=870)对应页数为:1
  8. 门头沟区(http://www.jkl.com.cn/cn/shopLis.aspx?id=871)对应页数为:1
  9. 大兴区(http://www.jkl.com.cn/cn/shopLis.aspx?id=873)对应页数为:1
  10. 通州区(http://www.jkl.com.cn/cn/shopLis.aspx?id=874)对应页数为:1
  11. 密云区(http://www.jkl.com.cn/cn/shopLis.aspx?id=876)对应页数为:1
  12. 怀柔区(http://www.jkl.com.cn/cn/shopLis.aspx?id=877)对应页数为:1
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
jjxx2005 + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 13:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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