1. 程式人生 > 其它 >scrapy爬取網站,並下載照片

scrapy爬取網站,並下載照片

scrapy爬取網站,並下載照片

  • items中定義實體

  • spider中編寫爬取邏輯

  • settings開啟一系列東西,

    IMAGES_STORE = 'images'
    
  • pipelines編寫照片儲存程式碼,以及圖片重新命名

    class DoubanImagePipeline(ImagesPipeline):
        def get_media_requests(self, item, info):
            yield scrapy.Request(item["bookImageLink"],meta={'name':item['bookName']})
    
        def file_path(self, request, response=None, info=None):
            name = request.meta['name']
            # name = re.sub(r'[?\\*|“<>:/]', '', name)  #防止一些圖片名稱稀奇古怪的
            imageName = name + '.jpg'
            return imageName
    
        def item_completed(self, results, item, info):
            return item
    
  • pipelines編寫資料儲存至csv檔案程式碼,編碼為utf8

class ToCsvPipeline(object):

    def __init__(self):
        # 開啟檔案,指定方式為寫,利用第3個引數把csv寫資料時產生的空行消除
        self.f = open("doubandushu.csv", "a", newline="",encoding='utf8')
        # 設定檔案第一行的欄位名,注意要跟spider傳過來的字典key名稱相同
        self.fieldnames = ["bookName", "bookScore", "bookDesc", "bookScoreNumber", "bookImageLink"]
        # 指定檔案的寫入方式為csv字典寫入,引數1為指定具體檔案,引數2為指定欄位名
        self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames)
        # 寫入第一行欄位名,因為只要寫入一次,所以檔案放在__init__裡面
        self.writer.writeheader()

    def process_item(self, item, spider):
        # 寫入spider傳過來的具體數值
        self.writer.writerow(item)
        # 寫入完返回
        return item

    def close(self, spider):
        self.f.close()
  • pipelines編寫資料儲存至mysql資料庫程式碼,中文儲存帶上編碼utf8
class ToMysqlPipeline(object):

    def __init__(self):
        # 建立連線
        self.conn = pymysql.connect(
            host = "39.101.142.214",
            user = "root", 
            password = "123456", 
            database = "mydb1", 
            charset = "utf8")  # 有中文要存入資料庫的話要加charset='utf8'
        
        # 建立遊標
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        # sql語句
        insert_sql = """
           insert into doubandushu(book_name,book_score,book_desc,book_score_number,book_image_link) VALUES(%s,%s,%s,%s,%s)
           """
        # 執行插入資料到資料庫操作
        self.cursor.execute(insert_sql, (item['bookName'], item['bookScore'], item['bookDesc'],
                                         item['bookScoreNumber'], item['bookImageLink']))
        # 提交,不進行提交無法儲存到資料庫
        self.conn.commit()

    def close_spider(self, spider):
        # 關閉遊標和連線
        self.cursor.close()
        self.conn.close()