求助各位前辈,为什么我爬取网页信息时他不翻页呢?
本帖最后由 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页
网页上有下一页有什么简单又智能的方法让他自动查找下一页吗? 网上有人说可以通过点下一页,然后动态的去翻页,但是代码都太复杂了,有没有易懂的? 网页点击的数据包有分析吗?你这问题就是因为少了提交的参数
提交方式是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) comeheres 发表于 2020-7-13 14:22
网页点击的数据包有分析吗?你这问题就是因为少了提交的参数
提交方式是POST
感谢回复,完全正确,还有一个问题,就是
for i in range(1, 4):
能不能写成动态的?就是这页有多少页就到多少页? 本帖最后由 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() 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]