鱼C论坛

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

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

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

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

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

x
本帖最后由 jjxx2005 于 2020-7-13 12:48 编辑
import requests
from lxml import etree
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'}
url2 = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
for i in range(1, 4):
    data = {'__EVENTARGUMENT':i}
    text1 = requests.get(url=url2, params=data,headers=UA).text
    tree1 = etree.HTML(text1)
    myname = tree1.xpath('//span[@class="con01"]/text()')
    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
import requests
from lxml import etree
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'}
url2 = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
for i in range(1, 4):
    data = {
        '__EVENTARGUMENT':i,
        '__EVENTTARGET':'AspNetPager1'
    }
    text1 = requests.post(url=url2, data=data, headers=UA).text
    tree1 = etree.HTML(text1)
    myname = [x.strip() for x in tree1.xpath('//span[@class="con01"]/text()')]
    print(myname)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

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

其中__VIEWSTATE和__VIEWSTATEGENERATOR这参数的值就在网页源码中,但经过分析只需提交__EVENTTARGET和__EVENTARGUMENT这两个参数就能正常获取信息。
444.png
import requests
from lxml import etree
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'}
url2 = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
for i in range(1, 4):
    data = {
        '__EVENTARGUMENT':i,
        '__EVENTTARGET':'AspNetPager1'
    }
    text1 = requests.post(url=url2, data=data, headers=UA).text
    tree1 = etree.HTML(text1)
    myname = [x.strip() for x in tree1.xpath('//span[@class="con01"]/text()')]
    print(myname)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

提交方式是POST

感谢回复,完全正确,还有一个问题,就是
for i in range(1, 4):
能不能写成动态的?就是这页有多少页就到多少页?
想知道小甲鱼最近在做啥?请访问 -> 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)
# _*_ coding: utf-8 _*_


import requests
from lxml import etree


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


def main():
    global data
    global headers
    r = requests.get(url=url, headers=headers)
    params = get_next_page_paramas(r)
    data['__VIEWSTATE'] = params[0]
    data['__VIEWSTATEGENERATOR'] = params[1]
    for item in range(2, 4):
        data['__EVENTARGUMENT'] = str(item)
        r = requests.post(url=url, headers=headers, data=data)
        html = etree.HTML(r.text)
        result = html.xpath('//span[@class="con01"]/text()')
        print(result)
        data['__VIEWSTATE'] = get_next_page_paramas(r)[0]
        print('='*100)


if __name__ == '__main__':
    data = {'__EVENTTARGET': 'AspNetPager1'}
    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'}
    url = 'http://www.jkl.com.cn/cn/shopLis.aspx?id=865'
    main()
想知道小甲鱼最近在做啥?请访问 -> 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

批量获取每个区的页数
import requests
from lxml import etree
import re
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'}

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

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

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 01:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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