苏宁图书爬取:
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 = 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("//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地址
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):