来源
抓取
选择一种商品搜索然后爬取商品价格信息。
import requests
res=requests.get('https://search.jd.com/Search?keyword=%E8%8B%A6%E7%93%9C&enc=utf-8&suggest=1.his.0.0&wq=&pvid=0138043bdf1d4750b99643554273c191').text
print(res)
发现结果为
<script>window.location.href='https://passport.jd.com/uc/login'</script>
需要登录,就加入User-Agent这个请求头,如图的值。
import requests
headers={
'User-Agent': '填写需要的部分'
}
url='https://search.jd.com/Search?keyword=%E8%8B%A6%E7%93%9C&enc=utf-8&suggest=1.his.0.0&wq=&pvid=0138043bdf1d4750b99643554273c191'
res=requests.get(url=url,headers=headers).text
print(res)
得到网址。
然后开始针对价格的代码位置
复制xpath值,对比
'//*[@id="J_goodsList"]/ul/li[1]/div/div[2]/strong/i'
'//*[@id="J_goodsList"]/ul/li[2]/div/div[2]/strong/i'
变化在li元素上
选择分两部分xpath
from lxml import etree
list=etree.HTML(res).xpath('//*[@id="J_goodsList"]/ul/li')
for i in list:
p=i.xpath('div/div[2]/strong/i/text()')[0]
print(p)
然后再看1,2,3页的网址
'https://search.jd.com/Search?keyword=%E8%8B%A6%E7%93%9C&qrst=1&suggest=1.his.0.0&wq=%E8%8B%A6%E7%93%9C&stock=1&pvid=0138043bdf1d4750b99643554273c191&page=1&s=1&click=0'
'https://search.jd.com/Search?keyword=%E8%8B%A6%E7%93%9C&qrst=1&suggest=1.his.0.0&wq=%E8%8B%A6%E7%93%9C&stock=1&pvid=0138043bdf1d4750b99643554273c191&page=3&s=56&click=0'
'https://search.jd.com/Search?keyword=%E8%8B%A6%E7%93%9C&qrst=1&suggest=1.his.0.0&wq=%E8%8B%A6%E7%93%9C&stock=1&pvid=0138043bdf1d4750b99643554273c191&page=5&s=116&click=0'
变化的值为page、s两个值,page有规律,s则难看出规律。
同时将网页翻到底部,会加载js
从js中取出一个数10029051555348,在网页源代码中查找![]()
然后确定这些wids数与新加载的js有关,就需要正则匹配,然后使用js的请求的网址:
num=re.compile("wids:'([\d+,]+)'").findall(res)[0]
url='https://search.jd.com/s_new.php?keyword=%E8%8B%A6%E7%93%9C&qrst=1&suggest=1.his.0.0&wq=%E8%8B%A6%E7%93%9C&stock=1&pvid=0138043bdf1d4750b99643554273c191&page=4&s=86&scrolling=y&log_id=1626253412276.4471&tpl=1_M&isList=0&show_items='+num
由于仅User-Agent这个请求头不够,需要补充referer。
headers={
'referer': '填写需要的部分',
'User-Agent': '填写需要的部分'
}
res2==requests.get(url=url,headers=headers).text
此时得到响应里的源代码。
从代码中理解到xpath值为’//li[1]/div/div[2]/strong/i’
因此单独爬取
list=etree.HTML(res2).xpath('//li')
for i in list:
p=i.xpath('div/div[2]/strong/i/text()')[0]
print(p)
然后还爬取商品名,代码如下
import re
import requests
headers={
'User-Agent': '填写需要的部分'
}
url='https://search.jd.com/Search?keyword=%E8%8B%A6%E7%93%9C&enc=utf-8&suggest=1.his.0.0&wq=&pvid=0138043bdf1d4750b99643554273c191'
res=requests.get(url=url,headers=headers).text
num=re.compile("wids:'([\d+,]+)'").findall(res)[0]
url='https://search.jd.com/s_new.php?keyword=%E8%8B%A6%E7%93%9C&qrst=1&suggest=1.his.0.0&wq=%E8%8B%A6%E7%93%9C&stock=1&pvid=0138043bdf1d4750b99643554273c191&page=4&s=86&scrolling=y&log_id=1626253412276.4471&tpl=1_M&isList=0&show_items='+num
headers={
'referer': '填写需要的部分',
'User-Agent': '填写需要的部分'
}
res2=requests.get(url=url,headers=headers).text
from lxml import etree
list=etree.HTML(res).xpath('//*[@id="J_goodsList"]/ul/li')
for i in list:
p=i.xpath('div/div[2]/strong/i/text()')[0]
k=i.xpath('div/div[3]/a/em//text()')
print(p,k)
list=etree.HTML(res2).xpath('//li')
for i in list:
p=i.xpath('div/div[2]/strong/i/text()')[0]
k=i.xpath('div/div[3]/a/em//text()')
print(p, k)
显示:
56.00 ['苦瓜', '新鲜蔬菜农家自种 当季凉瓜现摘 1000g']
23.80 ['新鲜', '苦瓜', '1-5斤现摘农家自种蔬菜凉瓜山东生鲜瓜 五斤泡沫箱']
33.80 ['京东超市', '\t\n【买2件=发3罐 共510克】丙田 原味', '苦瓜', '茶 花草茶 泡水喝的', '苦瓜', '片', '苦瓜', '干 170克/罐']
...
如果想商品顺序一样的话,就需要cookie值。其本身就是记录用户的习惯的,因此,能更加一致。
版权声明:本文为qq_23246143原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。