目录
scrapy爬虫:
1)创建scrapy项目
2)创建爬虫代码
3) 爬虫:
1. scrapy-环境搭建
2. scrapy-爬网页-转存文件到本地
3. scrapy原理
4. Scrapy shell
4.1 Scrapy作业-Scrapy shell
2)练习:
5. scrapy命令行工具
6.Spider文件夹
7. pycharm操作数据库
8. scrapy爬豆瓣
8.1 scrapy startproject doubanmovie
8.2 编辑保存数据的容器文件:items.py
8.3 切换terminal目录:cd doubanmovie
8.4 settings.py文件
8.5 配置pipelines.py文件(以实现持久化存储)
8.6 爬:scrapy crawl doubanspider
terminal下输入:scrapy startproject tutorial
切换目录: cd tutorial
执行上述命令后,自动的创建了scrapy项目
生成了项目目录-tutorial
scrapy.cfg 部署的配置文件
tutorial/
__init__.py 初始化文件,暂不操作
items.py 项目定义文件
middlewares.py 中间件文件
pipelines.py 项目管道文件
settings.py 项目配置文件
spiders/ 爬虫目录
创建\spiders\quotes_spider.py文件(在爬虫目录spiders下创建爬虫文件quotes_spider.py)
写入如下内容:
import scrapy
class QuotesSpider(scrapy.Spider):# 必须继承scarpy.Spider类
name = 'quotes' #爬虫项目唯一标识
# 创建爬虫方法
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split('/')[-2]
filename = 'quotes-%s.html'%page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s'%filename)
terminal下:
scrapy crawl quotes
--------------------------------------------------------------------------------------------------------------------------------
(综合如上的内容)
1) terminal下:创建scrapy项目-tutorial
scrapy startproject tutorial
再cd到tutorial
爬取数据的网页是:
http://quotes.toscrape.com/page/1/
http://quotes.toscrape.com/page/2/
2) 在项目目录:
tutorial/
tutorial/
spiders文件夹下创建爬虫代码文件:quotes_spider.py 书写未知的爬虫代码
import scrapy
class QuotesSpider(scrapy.Spider): #定义类并继承scrapy.Spider
name = 'quotes'
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/'
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split('/')[-2]
filename = 'quotes-%s.html'%page
with open(filename,'wb') as f:
f.write(response.body)
self.log('Saved file %s'%filename)
执行爬虫:
terminal:scrapy crawl quotes
1)Scrapy Engine引擎
负责控制数据流在系统组件的流动,当特定动作发生时触发事件
2)Scheduler调度器
从引擎中接收request并且将他们入队
3)Downloader下载器
负责获取页面数据并且提供给引擎,之后提供给spider
4)Spiders爬虫
它是Scrapy用户编写用于分析response并且获取item或者额外的数据
5)ItemPiPeline管道
负责将Spider爬虫提取出来的数据进行持久化保存
6)Downloader Middleware下载器中间件
是引擎和下载器之间特定组件,拥有㔘Downloader传递给引擎response
7)Spider Middleware Spider中间件
处理spider输入response与输出items和requests
http://quotes.toscrape.com/page/1/
terminal下输入:
scrapy shell "http://quotes.toscrape.com/page/1/"
提取标题
response.css('title')
提取标题文本
response.css('title').extract()
提取标题文本,返回文本内容列表
response.css('title::text').extract()
字符串格式的文本内容
response.css('title::text').extract_first()
或者
response.css('title::text')[0].extract()
5. 作业:terminal下的输入和输出内容发送到邮箱[email protected]
使用scrapy shell 爬取页面信息
scrapy shell ‘http://quotes.toscrape.com’
1)找css内容:div标签,属性值是quote
2)第一段名人名言的内容输出
3)第一段名人名言的作者输出
1)terminal下:
scrapy shell "http://quotes.toscrape.com/"
response:请求后的应答信息
获取页面内容:
.css
.xpath
返回页面信息:
extract()
extract_first()
获取页面标题
response.xpath('//title/text()').extract_first()
第一段
quote = response.css('div.quote')[0]
第一段中解析-名言
title = quote.css('span.text::text').extract_first()
第一段中解析-作者
author = quote.css('small.author::text').extract_first()
第一段中解析-标签
tags = quote.css('div.tags a.tag::text').extract()
遍历整个页面:
依次输出每段信息
In [13]: for quote in response.css('div.quote'):
...: text = quote.css('span.text::text').extract_first()
...: author = quote.css('small.author::text').extract_first()
...: tags = quote.css('div.tags a.tag::text').extract()
...: print(dict(text=text,author=author,tags=tags))
退出交互模式:
exit
1. 创建scrapy项目
改善爬虫代码:
下在页面转为打印页面信息
text/author/tags
代码:
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quote'
start_urls = [
'http://quotes.toscrape.com/page/1',
'http://quotes.toscrape.com/page/2'
]
def parse(self, response): #解析页面
for quote in response.css('div.quote'):
yield {
'text':quote.css('span.text::text').extract_first(),
'author':quote.css('small.author::text').extract_first(),
'tags':quote.css('a.tag::text').extract()
}
2. 写python代码完成数据库创建
import pymysql
con = pymysql.connect(
host = 'localhost',
user = 'root',
passwd = '123456',
charset = 'utf8'
)
cur = con.cursor()
cur.execute('CREATE DATABASE doubanmovie CHARACTER set utf8')
cur.execute('USE doubanmovie')
cur.execute("""
CREATE TABLE doubantop250(
ID INT (3) PRIMARY KEY NOT NULL AUTO_INCREMENT,
title VARCHAR (100),
movieinfo VARCHAR (1000),
star FLOAT (3,1) NOT NULL ,
quote VARCHAR (300) NOT NULL
)
CHARACTER SET utf8;
""")
con.commit()
cur.close()
con.close()
scrapy 官方文档:
https://www.osgeo.cn/scrapy/topics/downloader-middleware.html
2. scrapy命令行工具 Available commands: bench Run quick benchmark test fetch Fetch a URL using the Scrapy downloader genspider Generate new spider using pre-defined templates runspider Run a self-contained spider (without creating a project) settings Get settings values shell Interactive scraping console startproject Create new project version Print Scrapy version view Open URL in browser, as seen by Scrapy ------------------------------------------------------------ 1)scrapy startproject project_name 在scrapy项目目录下 创建project_name工程 2)scrapy genspider name domain 在当前的文件夹下创建爬虫,其中name是爬虫的名称 domain用于生成爬虫文件属性的allowd_domain以及start_urls scrapy genspider -l 调用爬虫模板 Available templates: basic crawl csvfeed xmlfeed scrapy genspider example example.com Created spider 'example' using template 'basic' in module: myProject.spiders.example 3)scrapy crawl spider_name 开始爬虫 4)scrapy check 检查错误 5)scrapy list 列出当前项目中可用的爬虫代码,按行 6) scrapy edit spider_name 编辑或调试爬虫代码 7)scrapy fetch url 使用scrapy下载器对给定的url进行内容输出 8)scrapy view url 在浏览器中打开给定的url 9)scrapy parse url 页面解析,解析结果通过callback选项传递 10)scrapy runspider spider_file.py 运行爬虫文件 11)scrapy version 查看版本号 12)scrapy bench 运行快速基准测试
2. Spider文件夹: 爬虫部分完成的操作有哪些? 抓取网页信息 提取格式化数据 框架中需要做哪些事情? 1)生成御用抓取的url然后指定请求方式下下在相应的回调函数 start_requests():指定了url,callback参数指定parse方法 parse():获取页面数据 2)回调函数解析网页,返回带有提取数据的Item对象, Request请求对象,然后执行scrapy下载 3)回调函数中使用parse方法解析 4)从返回数据的item项目中进行持久化
pycharm可以操作数据库 DataBase->'+'->Data Source->MySQL-> 参数配置: HOST Database User Password
切换terminal目录:cd doubanmovie
import scrapy
class DoubanmovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field() # 电影名称
movieinfo = scrapy.Field() # 电影描述信息
star = scrapy.Field() # 电影评分
quote = scrapy.Field() # 电影经典台词
pass
创建爬虫文件(terminal下运行)
scrapy genspider doubanspider douban.com(域名)
编辑爬虫文件:doubanspider.py
import scrapy
from scrapy.http import Request # 发送请求的模块
from scrapy.selector import Selector # 解析响应的模块方法-选择器
from doubanmovie.items import DoubanmovieItem # 导入容器
from urllib.parse import urljoin # url补全功能
#要爬取的对象
class DoubanspiderSpider(scrapy.Spider):
name = 'doubanspider'
allowed_domains = ['douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
item = DoubanmovieItem() # 创建容器
selector = Selector(response) # 创建选择器 #解析
Movies = selector.xpath('') # 页面中整体电影所在区域(''中是大盒子的xpath)
# 循环中获取每一项电影信息
for eachMovie in Movies:
# 解析每部电影采集的四条信息
title = eachMovie.xpath('').extract()
movieinfo = eachMovie.xpath('').extract()
star = eachMovie.xpath('').extract()
quote = eachMovie.xpath('').extract()
if quote:
quote = quote[0]
else:
quote = ''
# 解析内容保存至容器
item['title'] = title
item['movieinfo'] = movieinfo
item['star'] = star
item['quote'] = quote
yield item
# 解析多页
nextLink = selector.xpath('').extract()
if nextLink:
nextLink = nextLink[0]
yield Request(urljoin(response.url, nextLink), callback=self.parse)
加入浏览器代理配置、数据库配置、数据传输配置
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
数据库配置:
MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'doubanmovie'
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'
管道文件配置:
ITEM_PIPELINES = {
'doubanmovie.pipelines.DoubanmoviePipeline': 300,
}
# 连接数据库,导入settings.py中数据库配置
import pymysql
from doubanmovie import settings
class DoubanmoviePipeline(object):
def __init__(self):
# 创建连接对象属性,读取参数来自于settings.py
self.connect = pymysql.connect(
host = settings.MYSQL_HOST,
db = settings.MYSQL_DBNAME,
user = settings.MYSQL_USER,
passwd = settings.MYSQL_PASSWD,
charset = 'utf8',
use_unicode = True # unicode编码
)
self.cursor = self.connect.cursor() #创建游标
#持久化存储的配置
def process_item(self, item, spider):
try:
self.cursor.execute("""
insert into doubantop250(title, movieinfo, star, quote)
value (%s,%s,%s,%s)
""",(
item['title'],item['movieinfo'],item['star'],item['quote']
))
self.connect.commit()
except Exception as e:
print(e)
return item