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 ...
随机推荐
- 使用RAP2和Mock.JS实现Web API接口的数据模拟和测试
最近一直在思考如何对Web API的其接口数据进行独立开发的问题,随着Web API的越来越广泛应用,很多开发也要求前端后端分离,例如统一的Web API接口后,Winform团队.Web前端团队.微 ...
- Tutorial 03_分布式数据库HBASE
(一)编程实现一下内容,并用Hadoop提供的Shell命令完成相同任务: 编程实现: (1)列出HBase所有表的相关信息,例如表名; package tutorial01; import java ...
- 关于npm安装报错 网络问题等等等
最近需要安装taro 结果网络各种报错 解决方法 : 1重置网络 npm config rm proxynpm config rm https-proxy 2换淘宝镜像 npm config set ...
- spring整合redis使用RedisTemplate的坑Could not get a resource from the pool
一.背景 项目中使用spring框架整合redis,使用框架封装的RedisTemplate来实现数据的增删改查,项目上线后,我发现运行一段时间后,会出现异常Could not get a resou ...
- Xshell报错“The remote SSH server rejected X11 forwarding request.”
Xshell报错“The remote SSH server rejected X11 forwarding request.” 2012年12月17日 ⁄ Linux⁄ 共 218字 ⁄ 字号 小 ...
- Leetcode 4.28 Tree Easy
1. 101. Symmetric Tree 用递归. class Solution { public boolean isSymmetric(TreeNode root) { if( root == ...
- 《java核心技术36讲》学习笔记-------杨晓峰(极客时间)
非常荣幸作为晓峰哥的同事,之前就看过这篇文章,重写读一遍,再学习学习. 一.开篇词 初级.中级:java和计算机科学基础.开源框架的使用:高级.专家:java io/nio.并发.虚拟机.底层源码.分 ...
- java 11 实现RFC7539中指定的ChaCha20和Poly1305两种加密算法, 代替RC4
实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法 RFC7748定义的秘钥协商方案更高效, 更安全. JDK增加两个新的接口 XECPublicKey 和 ...
- vim命令替换操作
替换当前行第一个 vivian为sky :s/vivian/sky/ 替换当前行所有 vivian为sky :s/vivian/sky/g 替换第 n 行开始到最后一行中,每一行的第一个vivian为 ...
- ORCAL Merge into用法总结
简单的说就是,判断表中有没有符合on()条件中的数据,有了就更新数据,没有就插入数据. 有一个表T,有两个字段a.b,我们想在表T中做Insert/Update,如果条件满足,则更新T中b的值,否则在 ...