004 使用scrapy框架爬虫
0. 建立housePro的scrapy爬虫框架
# 1. 在终端输入,建立housePro项目
scrapy startproject housePro
# 2. 进入housePro
cd housePro
# 3. 建立爬虫文件
scrapy genspider house www.xxx.com
# 4. 执行程序
scrapy crawl house
1. 用scrapy爬取网站信息
li_list = response.xpath('//div[@class="list_wrap"]/ul')
for li in li_list:
li = li.xpath('./li//h1/a/text()').extract() # 要用extract()函数提取data数据
print(li)
li = li.xpath('./li//h1/a/text()').extract_first()
2. scrapy进行数据解析
调用parse的response参数,其中response对象可以直接调用xpath方法
3. scrapy的持久化存储
使用管道进行持久化流程
- 1.获取解析到的数据值
- 2.将解析到的数据值存储到item对象
- 3.通过yield关键字提交到管道
- 4.在管道文件中进行持久化存储的编写(process_item)
- 5.在配置文件中开启管道
实例化一个item类型的对象的方法
item = BossproItem()
将解析到的数据值存储到item对象中
item['name'] = name
item['salary'] = salary
item['address'] = address
将item对象提交管道进行存储
yield item
对于scrapy的持久化存储,需要用到两个文件,一个是items,另一个是pipelines。
items用来定义存储数据的变量名
pipelines用来进行数据的存储
open_spider:执行pipelines时,会自动执行
close_spider:用来关闭数据库连接时使用
process_item:用来存储参数item中传入的参数
最重要的是要进pipelines从注释中解救出来
ITEM_PIPELINES = {
'BossPro.pipelines.BossproPipeline': 300,
'BossPro.pipelines.MysqlPipeline': 220,
'BossPro.pipelines.RedisPipeline': 200,
}
class BossproPipeline(object):
fp = None
# 只会被执行一次
def open_spider(self, spider):
print('开始爬虫')
self.fp = open('./Boss.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
# 爬虫文件每提交一次,该方法就会调用一次
# 注意:默认情况下,管道机制没有开启,需要手动开启
self.fp.write(item['name'] + '===>' + item['salary'])
return item
def close_spider(self, spider):
print('爬虫结束')
self.fp.close()
存储成txt类型
class MysqlPipeline(object):
def open_spider(self, spider):
self.conn = pymysql.Connect(host='127.0.0.1', user='root', passwd='', db='crm')
def process_item(self, item, spider):
self.cursor = self.conn.cursor()
sql = 'insert into Boss (name, salary, address) values ("%s", "%s", "%s")' % (item['name'], item['salary'], item['address'])
# print(sql)
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
self.cursor.close()
return item
def close_spider(self, spider):
self.conn.close()
存储到mysql中
class RedisPipeline(object):
conn = None
def open_spider(self, spider):
self.conn = Redis(host='127.0.0.1', port=6379)
print(self.conn)
def process_item(self, item, spider):
dic = {
'name': item['name'],
'salary': item['salary'],
'address': item['address'],
}
self.conn.lpush('Boss', dic)
return item
存储到redis中
4. 使用scrapy发送post请求
# 作用:将起始url列表中的url进行get请求的发送
def start_requests(self):
data = {
'kw': 'dog',
}
for url in self.start_urls: yield scrapy.FormRequest(url=url, callback=self.parse, formdata=data)
发送Post请求
5. 输出日志等级
LOG_LEVEL = 'ERROR'
LOG_FILE = './log.txt'
6. 请求传参
在Request中加入meta参数,以字典方式存入
yield scrapy.Request(url=detail_url, callback=self.get_detail, meta={'item': item})
item = response.meta['item']
7. 提高效率的几种方法
CONCURRENT_REQUESTS = 10
LOG_LEVEL = 'ERROR'
COOKIES_ENABLED = False
RETRY_ENABLED = False
DOWNLOAD_TIMEOUT = 5
8. 修改代理IP和UA值
- 修改代理IP
在下载中间键中修改process_request函数
# 拦截请求 request参数就是拦截到的请求
def process_request(self, request, spider):
print('下载中间件' + request.url)
if request.url.split(':')[0] == 'http':
request.meta['proxy'] = 'http://103.42.213.176:8080'
else:
request.meta['proxy'] = 'https://218.60.8.98:3129' return None
需要在settings中开启下载中间键
DOWNLOADER_MIDDLEWARES = {
'proxyPro.middlewares.ProxyproDownloaderMiddleware': 543,
}
- 修改UA值
def process_request(self, request, spider):
print('下载中间件' + request.url)
request.headers['User-Agent'] = 'UA值' return None
9. 使用selenium进行动态数据的获取
需要在spider中先实例化一个浏览器对象,不能在中间件中实例化
def __init__(self):
# 实例化一个浏览器对象
self.bro = webdriver.Chrome(executable_path='F:\\anaconda\chromedriver.exe') def close_spider(self, spider):
self.bro.quit()
def process_response(self, request, response, spider):
if request.url in ['https://war.163.com/']:
# 处理相应对象
bro = spider.bro # 获取在爬虫文件中创建好的浏览器对象
bro.get(request.url)
sleep(1)
js = 'window.scrollTo(0, document.body.scrollHeight)'
bro.execute_script(js)
sleep(0.5)
bro.execute_script(js)
sleep(0.5)
bro.execute_script(js)
page_text = bro.page_source # 需要的页面
# 创建一个新的相应对象并且将上述获取的页面数据加载到响应对象中,
# 然后将响应对象返回 return HtmlResponse(url=bro.current_url, body=page_text, encoding='utf-8', request=request)
return response
中间键中拦截响应进行动态加载
10. crawlspider
建立crawlSpider实例
scrapy genspider -t crawl crawlDemo www.xxxx.com
# 连接提取器:(follow=False)就是用来提取起始url对应页面中符合要求的连接
link = LinkExtractor(allow=r'/all/hot/recent/\d+') rules = (
# 规则解析器对象:将连接提取器提取的连接对应的页面源码数据根据要求进行解析
Rule(link, callback='parse_item', follow=False),
)
004 使用scrapy框架爬虫的更多相关文章
- Scrapy框架-----爬虫
说明:文章是本人读了崔庆才的Python3---网络爬虫开发实战,做的简单整理,希望能帮助正在学习的小伙伴~~ 1. 准备工作: 安装Scrapy框架.MongoDB和PyMongo库,如果没有安装, ...
- 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码
第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
- 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...
- 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...
- 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...
- Python爬虫进阶(Scrapy框架爬虫)
准备工作: 配置环境问题什么的我昨天已经写了,那么今天直接安装三个库 首先第一步: ...
- python scrapy框架爬虫遇到301
1.什么是状态码301 301 Moved Permanently(永久重定向) 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编 ...
- Scrapy框架爬虫
一.sprapy爬虫框架 pip install pypiwin32 1) 创建爬虫框架 scrapy startproject Project # 创建爬虫项目 You can start your ...
随机推荐
- Core官方DI解析(2)-ServiceProvider
ServiceProvider ServiceProvider是我们用来获取服务实例对象的类型,它也是一个特别简单的类型,因为这个类型本身并没有做什么,其实以一种代理模式,其核心功能全部都在IServ ...
- 《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想
前言 借书正式出版之际,完整回顾下从写博客到写书整个历程,也算是对自己近三年在技术上的一个总结,整个历程可通过三个万万没想到来概括,请耐心阅读. 写博.写书完整历程回顾 从2013年12月注册博客园账 ...
- EntityFramework Core指定更新导航属性了解一下?
前言 本文来自和何镇汐大哥的探讨,很多时候我习惯于和别人交流过后会思考一些问题,无论是天马行空还是浅薄的想法都会记录下来,或许看到此博文的您能给我更多的思考,与人交流总能收获很多东西,出发点不一样则结 ...
- 类Math
概述 java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数.类似这样的工具 类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单. 常用方法 ...
- Linux操作系统的文件链接
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的文件链接内容:文件链接时间:2019年 ...
- spring事物与传播行为
一.事物的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 作用:事物就是保证数据的一致性 事物的特性:事务必须服从ISO/IEC所制定的ACID原则.ACID是原 ...
- [题解]邮递员寄信(luoguP1629)
题目来源:luoguP1629 题目描述 有一个邮递员要送东西,邮局在结点1.他总共要送N-1样东西,其目的地分别是2-N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条 ...
- [Luogu 4245] 任意模数NTT
Description 给定 \(2\) 个多项式 \(F(x), G(x)\),请求出 \(F(x) * G(x)\). 系数对 \(p\) 取模,且不保证 \(p\) 可以分解成 \(p = a ...
- k8s-jenkins 自动化1
一个流水线例子: 设置参数化构建: 流水线指令: def label = "docker-${UUID.randomUUID().toString()}" podTemplate( ...
- LVS负载均衡DR模式实现
LVS负载均衡之DR模式配置 DR 模式架构图: 操作步骤 实验环境准备:(centos7平台) 所有服务器上配置 # systemctl stop firewalld //关闭防火墙 # sed - ...