jjxx2005 发表于 2020-7-13 10:45:13

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

本帖最后由 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页

网页上有下一页有什么简单又智能的方法让他自动查找下一页吗?

jjxx2005 发表于 2020-7-13 13:00:08

网上有人说可以通过点下一页,然后动态的去翻页,但是代码都太复杂了,有没有易懂的?

comeheres 发表于 2020-7-13 14:22:40

网页点击的数据包有分析吗?你这问题就是因为少了提交的参数

提交方式是POST

总共提交了4个参数


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


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 = /text()')]
    print(myname)

jjxx2005 发表于 2020-7-13 14:33:09

comeheres 发表于 2020-7-13 14:22
网页点击的数据包有分析吗?你这问题就是因为少了提交的参数

提交方式是POST


感谢回复,完全正确,还有一个问题,就是
for i in range(1, 4):
能不能写成动态的?就是这页有多少页就到多少页?

suchocolate 发表于 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
    data['__VIEWSTATEGENERATOR'] = params
    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)
      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()

comeheres 发表于 2020-7-13 16:53:44

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

通过分析网页上“尾页”按钮所对应的href内容来确定


批量获取每个区的页数
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/div/div/ul/li/a')
for x in xlist:
    id = x.xpath('@id')
    name = x.xpath('text()').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/@href')
    if page != []:
      result = re.search("(\d+)'\)", page)
      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]
查看完整版本: 求助各位前辈,为什么我爬取网页信息时他不翻页呢?