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 ...
随机推荐
- CentOS7.x安装kickstart
kickstart简介 kickstartkickstart是RedHat公司开源的软件,所以对CentOS兼容性最好,是一种无人值守的安装方式就是将手动安装配置的步骤,记录到文件中,然后通过kick ...
- [BJOI2019]光线[递推]
题意 题目链接 分析 令 \(f_i\) 表示光线第一次从第一块玻璃射出第 \(i\) 块玻璃的比率. 令 \(g_i\) 表示光线射回第 \(i\) 块玻璃,再射出第 \(i\) 块玻璃的比率. 容 ...
- Python并发式编程
目录 进程 线程 GIL(Global Interpreter Lock) 线程的调用方式 直接调用 继承调用 join&Daemon方法 Daemon(True) 同步锁 死锁 递归锁 同步 ...
- 偶发异常BUG,如何高效精准分析排查定位?
偶发异常BUG,如何高效精准分析排查定位? 作为测试,经常会收到领导.同事.用户反馈过来各种各样BUG,令人措手不及 首选需要判断确认是不是BUG,不要急于给予回复,需有充分的条件给予说明回复 很多测 ...
- SpringMVC 实现文件上传与下载,并配置异常页面
目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...
- Spring通过注释配置Bean2 关联关系
接着我们讲讲关联关系的配置,我们耳熟能详的MVC结构,Controller关联着Service,Service关联着UserRepository,接着上一节的代码,完成上诉功能 在Main方法里,我们 ...
- Singleton多种实现方式的在多线程情况下的优缺点
一.饿汉式 缺点:不能懒加载 // 不能懒加载 public class SingletonObject1 { private static final SingletonObject1 instan ...
- HDU 2586 How far way?
传送门 继续水板子题... #include <bits/stdc++.h> using namespace std; inline int read() { , f = ; char c ...
- luogu P1723 高手过愚人节
打算下周讲课就讲Manacher了 所以百度了一下相关题目,发现了一道千古好题 这道题没想到是一道模板题,模板中的模板 简要说一下思路,我们先复制一遍模板(甚至变量都不用改 然后唯一的区别就是要求的是 ...
- cv2.matchTemplate()函数的应用,匹配图片后画出矩形
import cv2 as cv import numpy as np """ matchTemplate(): 参数image:待搜索的图像(大图) 参数temple: ...