项目介绍
这个项目我们的主题是爬腾讯视频的影片信息,包括影片名和描述
搭建项目所需环境(确保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())
执行结果
好了代码到这里基本是完成,有基础的按照步骤来,很容易学会的,有疑问的小伙伴请留言