苏宁图书爬取

后续技术类文档更新到微信公众号-------->>喜欢的扫码关注

苏宁图书爬取:

  1. 创建项目工程:
    Scrapy startprojeect suning(项目名称)
  2. 创建爬虫:
    Scrapy genspider sn book.suning.com
  3. 获取大分类的分组:

div_list = response.xpath("//div[@class=‘menu-list’]/div[@class=‘menu-item’]")
4. 获取大分类下面的子菜单:

div_sub_list = response.xpath("//div[@class=‘menu-list’]/div[@class=‘menu-sub’]")
for div in div_list:
item = {}
#大分类的名字

item[“b_cate”] = div.xpath(".//h3/a/text()").extract_first()

当前大分类的所有的中间分类的位置

current_sub_div = div_sub_list[div_list.index(div)]

获取中间分类的分组

p_list = current_sub_div.xpath(".//div[@class=‘submenu-left’]/p[@class=‘submenu-item’]")

Xpath取当前节点的兄弟节点:
./following-sibling::

获取小分类的分组:

获取小分类的分组

li_list = p.xpath("./following-sibling::ul[1]/li")

for li in li_list:
# 小分类的名字
item[“s_cate”] = li.xpath("./a/text()").extract_first()
# 小分类的URL地址
item[“s_href”] = li.xpath("./a/@href").extract_first()

请求图书的列表页

yield scrapy.Request(
item[“s_href”],
callback=self.parse_book_list,
meta={“item”: deepcopy(item)}#采用深拷贝,将每一次的值都重新复制一份,避免不会被覆盖
)

经过测试后发现只能拿到第一页的前半部分数据:
所以确定后半部分和前半部分的url不同
找到后半段部分的url

Request URL:
https://list.suning.com/emall/showProductList.do?ci=502325&pg=03&cp=0&il=0&iy=0&adNumber=0&n=1&ch=4&prune=0&sesab=ACBAAB&id=IDENTIFYING&cc=029&paging=1&sub=0

发送请求,获取列表页第一页后一部分的数据

next_part_url_temp = “https://list.suning.com/emall/showProductList.do?ci={}&pg=03&cp=0&il=0&iy=0&adNumber=0&n=1&ch=4&sesab=ABBAAA&id=IDENTIFYING&cc=010&paging=1&sub=0”

获取url地址的ci

以上几个url里面没有我们想要的切割字符所以会报错
ci = item[“s_href”].split("-")[1]# https://list.suning.com/1-502320-0.html
next_part_url = next_part_url_temp.format(ci)

传递参数发起请求请求后一部分数据:
yield scrapy.Request(
next_part_url,#拼接好的后一部分数据图书的url
callback=self.parse_book_list,#回调函数用来发起请求
meta={“item”: deepcopy(item)}#参数传递;为了避免覆盖使用深拷贝的方法
)

处理图书的列表内容:
def parse_book_list(self, response): # 处理图书列表页内容
item = response.meta[“item”]#请求传递过来的参数
获取图书列表页的分组:

获取图书列表页的分组

li_list = response.xpath("//div[@id=‘filter-results’]/ul/li")

li_list = response.xpath("//li[contains(@class,‘product book’)]")
“contains”在以上标签中的意思是“包含“
语句意思是:凡是li标签下面的class属性里面包含’product book’的值;都找到

找书名

for li in li_list[:1]:
# 书名
item[“book_name”] = li.xpath(".//p[@class=‘sell-point’]/a/text()").extract_first().strip()
找书的url地址

书的url地址,不完整

item[“book_href”] = li.xpath(".//p[@class=‘sell-point’]/a/@href").extract_first()
以上获取到的url地址不完整可以拼接:
item[“book_href”] = self.par_url + li.xpath(".//p[@class=‘sell-point’]/a/@href").extract_first()
找书店名:

书店名

item[“book_store_name”] = li.xpath(
“.//p[contains(@class,‘seller oh no-more’)]/a/text()”).extract_first()

发送详情页的请求

yield response.follow(
item[“book_href”],
callback=self.parse_book_detail,
meta={“item”: deepcopy(item)}
)

定义处理图书详情页的内容:

处理图书详情页的内容

def parse_book_detail(self):

你可能感兴趣的:(爬虫)