scrapy入門實戰-以起點中文網的小說爲例

scrapy是一個python的爬取框架,可以利用該框架爬取網絡信息,這篇博客以起點中文網爲例(https://www.qidian.com/),爬取小說概略信息(以下內容是在你已經配置好環境之後的基礎上進行的)。下圖是我們要爬取的內容。
在這裏插入圖片描述

scrapy常用命令行

打開命令行:(這個就不說了,如果這個都不會,下面的你就別看了);
創建新項目:scrapy startproject xxx;
創建spider文件:scrapy genspider xxx qidian.com (說明:xxx爲你的spider名字,qidian.com是爬取網站的域名);

實戰開始

1、打開你想創建項目的目錄,在路徑欄上輸入cmd,會在該路徑下打開命令行。
cmd
2、在彈出的cmd窗口輸入scrapy startproject bookinfo
startproject
3、創建spider文件,進入bookinfo文件,在命令行輸入scrapy genspider bookload qidian.com
spider

4、用PyCharm打開項目
5、打開項目後,我們可以在PyCharm下面的命令菜單上輸入scrapy shell www.qidian.com來查看相應信息
在這裏插入圖片描述
在返回的結果中,輸入response 回車來查看該網站是否允許爬取(200表示允許)
response
6、打開item.py 文件,寫我們需要爬取的信息。

import scrapy


class BookinfoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 小說名字
    bookname = scrapy.Field()
    # 作者
    bookauthor = scrapy.Field()
    # 小說類型
    booktype = scrapy.Field()
    # 小說狀態
    bookstation = scrapy.Field()
    # 小說簡介
    booksimpleinfo = scrapy.Field()

7、寫完item後編寫piplines.py 管道,把爬取後的信息存成我們想要的格式。

class BookinfoPipeline(object):
    def __init__(self):
        self.f = open("bookinfo.json", 'w')

    def process_item(self, item, spider):
        content = json.dumps(dict(item), ensure_ascii=False) + ",\n"
        self.f.write(content)
        return item

    def close_spider(self, spider):
        self.f.close()

8、下面就開始寫spider裏的內容,也就是bookload.py的內容。先屢一下思路:
(1):當你剛開始點開網站的時候是www.qidian.com 然後點擊的全部作品 網站是www.qidian.com/all
(2): 這個頁面有好幾頁,當你點擊第二頁的時候你就看到這個網址是https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=2
(3):然後你再點擊翻頁位置的第一頁的時候 返回的網址是https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1也就是說 第幾頁其實就是修改page=後面的內容,這就是我們總結的網頁規律
(4):然後我們的url可以改寫成兩部分:url=baseurl+num 也就是https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page= + num
寫spider(bookload.py)的內容:

# -*- coding: utf-8 -*-
import scrapy

from bookinfo.items import BookinfoItem


class BookloadSpider(scrapy.Spider):
    name = 'bookload'
    baseurl = "https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page="
    offset = 1
    # start_urls = ['http://qidian.com/']
    start_urls = [baseurl + str(offset)]
    print(start_urls)

    def parse(self, response):
		# 父節點獲取ul
        node_list = response.xpath("//ul[@class='all-img-list cf']/li")
        # 遍歷父節點 得到子節點
        for node in node_list:
            item = BookinfoItem()
            item['bookname'] = node.xpath("./div[@class='book-mid-info']/h4/a/text()").extract_first()
            item['bookauthor'] = node.xpath(
                "./div[@class='book-mid-info']/p/a[@class='name']/text()").extract_first()
            item['booktype'] = node.xpath("./div[@class='book-mid-info']/p/a[2]/text()").extract_first()
            item['bookstation'] = node.xpath("./div[@class='book-mid-info']/p/span/text()").extract_first()
            item['booksimpleinfo'] = node.xpath(
                "./div[@class='book-mid-info']/p[@class='intro']/text()").extract_first()
            yield item

        if self.offset < 5:
            self.offset += 1
            url = self.baseurl + str(self.offset)
            print("下一頁")
            yield scrapy.Request(url, callback=self.parse)

講一下這個spider文件
在這裏插入圖片描述
在爬取之前我們先找到父節點,就是所有書的集合ul 然後就遍歷ul底下的li子節點,li中含有我們需要的內容。
9、利用回調函數 繼續讀取下一個url
10、在PyCharm的命令行中運行 scrapy crawl bookload 結果如下:
在這裏插入圖片描述

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