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 ...
随机推荐
- 逆向-攻防世界-no-strings-attached
看题目就知道查找不到关键字符串,为防止踩坑,strings命令查看,没有找到有用的字符串.IDA载入程序查找入口函数, main函数中有4个函数,经过分析判断authenticate()为关键函数,跟 ...
- CodeSmith 一、连接Mysql
下载了codesmith 8,连接Mysql却提示“找不到请求的 .Net Framework Data Provider". 1,下载MySql.Data.dll:https://dev. ...
- vue nextTick使用
Vue nextTick使用 vue生命周期 原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue. ...
- C# 菜单之递归算法
今天因为菜单的问题, 需要用到递归算法, 在此记录一下: 1.表结构如下:(这里只是展示两个比较重要的字段) ,大家应该都看明白 2.先定义一个菜单结构类. 3.实现递归. private List& ...
- day11(函数参数,函数对象,打散机制,函数嵌套调用)
一,复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发 ...
- anaconda安装第三方库两种方式
①在anaconda命令行安装: ②在pycharm中安装:
- python的排序方式
""" 冒泡排序: 冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置 比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, ...
- 特殊计数序列——第二类斯特林(stirling)数
计算式 \[ S(n,m)=S(n-1,m-1)+mS(n,m) \] \(S(0,0)=1,S(i,0)=0(i>0)\) 组合意义 将\(n\)个不可分辨的小球放入\(m\)个不可分辨的盒子 ...
- 什么是SerDes,serializer/deserializer?
序列化器与反序列化器(SerDes,serializer/deserializer)是一种进行串行数据和并行数据相互转换的收发集成电路(IC).发送器部分是一个串行到并行的转换器,接收器部分是一个并行 ...
- unittest 框架-待优化
模块1 :getdata.py 读取测试用例test_case.xlsx,返回测试用例结果 import json from openpyxl import load_workbook class D ...