蘇寧圖書爬取

蘇寧圖書爬取:

  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):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章