先看源代码
import requests
from lxml import html
def spider(sn,book_list = []):
"""爬取京东图书数据"""
url = 'https://search.jd.com/Search?keyword={0}'.format(sn) # 使用format方法获取图书sn号
heard = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
# 获取html文档
resp = requests.get(url,headers=heard) # 取出头部
resp.encoding = 'utf-8'
html_doc = resp.text
# 获取xpath对象
selector = html.fromstring(html_doc)
# 找到列表集合
ul_list = selector.xpath('//div[@id="J_goodsList"]/ul/li')
print(len(ul_list))
# 解析对应的内容,标题,价格,链接
for li in ul_list:
# 标题
title = li.xpath('div/div[@class="p-name"]/a/em/text()')
print(title[0])
# 购买链接
link = li.xpath('div/div[@class="p-name"]/a/@href')
print(link[0])
# 价格
price = li.xpath('div/div[@class="p-price"]/strong/i/text()')
print(price[0])
# 出版社
shop = li.xpath('div/div[@class="p-shopnum"]/a/@title')
print(shop[0])
print('-----------------------------')
book_list.append({
'title' : title[0],
'price' : price[0],
'link' : link[0],
'shop' : shop[0]
})
if __name__ == "__main__":
spider('9787115428028')
我们从代码的开始来看,我们需要获取url,这里用了format方法保存图书的sn号。
url = 'https://search.jd.com/Search?keyword={0}'.format(sn)
然后根据url获取html文档,爬取京东是需要将头部取出,设置字符编码为utf-8,否则会乱码。
resp = requests.get(url,headers=heard) # 取出头部
resp.encoding = 'utf-8'
html_doc = resp.text
按F12k可以查看网页信息,从上图位置取出头部,格式如下:
heard = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
然后我们需要将html文档转换为xpath可以识别的对象
selector = html.fromstring(html_doc)
这里主要的点就是使用xpath从html文档中获取图书列表,我们先在网页中找到图书列表的位置。
ul_list = selector.xpath('//div[@id="J_goodsList"]/ul/li')
//表示从页面的任意位置匹配,然后我看到列表再div标签下,属性id为J_goodsList,div标签下面还有一个ul标签,下面的li标签就是我们需要的图书列表。
取出列表我们就可以对列表中的图书进行信息查找了,如查找标题。
for li in ul_list:
# 标题
title = li.xpath('div/div[@class="p-name"]/a/em/text()')
print(title[0])
使用for循环遍历列表,取出标题,同样使用xpath取出标题位置。
可以点击上面标注的小箭头,然后点击网页中图书的标题就会在右边的页面自动找到。那么怎么用xpath表示呢,这里就把li标签作为根目录,标题在em标签里,前面有一个a标签和两个div标签,使用class属性指定唯一的div标签。确定之后使用text()取出标签内容。
当然,要找其他信息也是一样的,就不一一举例了。