項目介紹
這個項目我們的主題是爬騰訊視頻的影片信息,包括影片名和描述
搭建項目所需環境(確保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())
執行結果
好了代碼到這里基本是完成,有基礎的按照步驟來,很容易學會的,有疑問的小伙伴請留言