爬蟲-用scrapy框架爬取騰訊視頻完整案例


項目介紹

這個項目我們的主題是爬騰訊視頻的影片信息,包括影片名和描述
image

搭建項目所需環境(確保python已經安裝的前提下)

打開終端一個一個安裝完成即可

python -m pip install --upgrade pip

pip install wheel

pip install lxml

pip install twisted

pip install pywin32

pip install scrapy

創建項目

打開一個終端輸入(建議放到合適的路徑下,默認是C盤)
cd desktop(進入桌面)
scrapy startproject TXmovies(創建項目,項目文件名字叫TXmovies)
cd TXmovies(進入項目TXmovies下面)
scrapy genspider txms v.qq.com(構建項目)

修改setting

修改三項內容,第一個是不遵循機器人協議,第二個是下載間隙,由於下面的程序要下載多個頁面,所以需要給一個間隙(不給也可以,只是很容易被偵測到),第三個是請求頭,添加一個User-Agent,第四個是打開一個管道

點擊查看代碼
# 設置是否為機器人身份
ROBOTSTXT_OBEY = False

# 設置下載間隙
DOWNLOAD_DELAY = 1

# 設置默認請求頭-瀏覽器
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
'application/signed-exchange;v=b3;q=0.9',
'Accept-Language': 'zh-CN,zh;q=0.9',
'accept-encoding': 'gzip, deflate, br',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/100.0.4896.60 Safari/537.36',
}
# 設置管道優先級
ITEM_PIPELINES = {
'TXmovies.pipelines.TxmoviesPipeline': 300,
}

確認要提取的數據,items項

item定義你要提取的內容(定義數據結構),比如我提取的內容為電影名和電影描述,我就創建兩個變量。Field方法實際上的做法是創建一個字典,給字典添加一個建,暫時不賦值,等待提取數據后再賦值。下面item的結構可以表示為:{'name':'','descripition':''}

完整代碼如下:

點擊查看代碼
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class TxmoviesItem(scrapy.Item):
# 需要爬取的數據項,定義成員變量
# define the fields for your item here like:
# name = scrapy.Field()

# 名字
name = scrapy.Field()
# 說明,表述
description = scrapy.Field()

寫爬蟲程序,txms項

我們要寫的部分是parse方法里的內容,重點在於如何寫xpath,關於xpath我不多講,有興趣可以看看我另一篇文章,XPATH教程

引入剛剛寫好的item,剛剛說了item里面創建的變量就是字典的鍵值,可以直接進行賦值。賦值后交給管道處理。

完整代碼如下:

點擊查看代碼
import scrapy
from ..items import TxmoviesItem


class TxmsSpider(scrapy.Spider):
name = 'txms'
allowed_domains = ['v.qq.com']
# 爬取數據的地址
start_urls = ['https://v.qq.com/x/bu/pagesheet/list?append=1&channel=tv&iarea=1&listpage=2&offset=0&pagesize=30']
# 爬取頁數
offset = 0

# parse()方法負責處理response並返回處理的數據以及(/或)跟進的URL。
# 該方法及其他的Request回調函數必須返回一個包含 Request 及(或) Item 的可迭代的對象。
def parse(self, response):
# 定義一個容器保存爬取的信息(此容器為items模塊里面的類)
items = TxmoviesItem()
# 這部分是爬取部分,使用xpath的方式選擇信息
lists = response.xpath('//div[@class="list_item"]')
# 循環遍歷lists里面的值
for i in lists:
items['name'] = i.xpath('./a/@title').get()
items['description'] = i.xpath('./div/div/@title').get()

# 移交控制權給管道
yield items

# 爬取了150項的內容,通過分析HTML頁面可以發現每30個一頁
if self.offset < 120:
self.offset += 30
# 把頁碼變成可變
url = "https://v.qq.com/x/bu/pagesheet/list?append=1&channel=tv&iarea=1&listpage=2&offset={" \
"}&pagesize=30".format(str(self.offset))
# 返回調自己
yield scrapy.Request(url=url, callback=self.parse)

交給管道輸出,pipelines項

管道可以處理提取的數據,如存數據庫。我們這里僅輸出。

完整代碼如下

點擊查看代碼
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


class TxmoviesPipeline(object):
	def process_item(self, item, spider):
		print(item)
		return item

run,執行項目

①如果用的是終端直接輸入如下代碼即可運行
scrapy crawl txms
②如果用的是PyCharm等界面軟件

完整代碼如下

點擊查看代碼
from scrapy import cmdline

cmdline.execute('scrapy crawl txms'.split())

執行結果

image

好了代碼到這里基本是完成,有基礎的按照步驟來,很容易學會的,有疑問的小伙伴請留言


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM