蘇寧圖書爬取:
- 創建項目工程:
Scrapy startprojeect suning(項目名稱) - 創建爬蟲:
Scrapy genspider sn book.suning.com - 獲取大分類的分組:
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
發送請求,獲取列表頁第一頁後一部分的數據
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):