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框架爬虫的更多相关文章

  1. Scrapy框架-----爬虫

    说明:文章是本人读了崔庆才的Python3---网络爬虫开发实战,做的简单整理,希望能帮助正在学习的小伙伴~~ 1. 准备工作: 安装Scrapy框架.MongoDB和PyMongo库,如果没有安装, ...

  2. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  3. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  4. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  5. 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

    第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...

  6. 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...

  7. Python爬虫进阶(Scrapy框架爬虫)

    准备工作:           配置环境问题什么的我昨天已经写了,那么今天直接安装三个库                        首先第一步:                           ...

  8. python scrapy框架爬虫遇到301

    1.什么是状态码301 301 Moved Permanently(永久重定向) 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编 ...

  9. Scrapy框架爬虫

    一.sprapy爬虫框架 pip install pypiwin32 1) 创建爬虫框架 scrapy startproject Project # 创建爬虫项目 You can start your ...

随机推荐

  1. host头注入

    看到有说这个题为出题而出题,其实我还是这么觉得, host出问题的话我觉得一般只有在审计代码,看到才知道有host注入 假设不提示host注入,就有难度了 常规的注入了

  2. selenium跳过webdriver检测并模拟登录淘宝

    目录 简介 编写思路 使用教程 演示图片 源代码 @(文章目录) 简介 模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网 ...

  3. Dom 动态添加元素节点总结

    jQuery创建元素节点的方法: 创建元素节点: $("<div></div>"): 创建文本节点: $("<div>直接将文本的内容 ...

  4. jmeter学习记录--10--二次开发环境搭建

    JMeter源码集成到Eclipse.JMeter二次开发(1)-eclipse环境配置及源码编译 ,根据此文章记录将jmeter源码集成到myecplise 第一步:下载jmeter源码http:/ ...

  5. CodeForces 1151D Stas and the Queue at the Buffet

    题目链接:http://codeforces.com/contest/1151/problem/D 题目大意: 有n个学生排成一队(序号从1到n),每个学生有2个评定标准(a, b),设每个学生的位置 ...

  6. 怎么写自己的CMakeLists.txt

    一. 为什么要使用cmake 理论上说,任意一个C++程序都可以用g++来编译.但当程序规模越来越大时,一个工程可能有许多个文件夹和源文件,这时输入的编译命令将越来越长.通常一个小型C++项目可能含有 ...

  7. ZooKeeper连接并创建节点以及实现分布式锁操作节点排序输出最小节点Demo

    class LockThread implements Runnable { private DistributedLock lock; public LockThread(int threadId, ...

  8. [数据库] windows server 2003下mysql出现10048错误的解决办法 Can't connect to MySQL server on '127.0.0.1' (10048)(抄)

    网站访问量大了的时候mysql连接数自然就多了,当超出mysql最大连接数的时候就会出现错误,当出现too many字样的错误的时候一般是因为连接数的问题,只需要修改最大连接数max_conectio ...

  9. 特殊计数序列——第一类斯特林(stirling)数

    第一类斯特林数 在这里我因为懒所以还是用\(S(n,m)\)表示第一类斯特林数,但一定要和第二类斯特林数区分开来 递推式 \(S(n,m)=S(n-1.m-1)+S(n-1,m)*(n-1)\) 其中 ...

  10. 【AGC030D】Inversion Sum DP

    题目大意 有一个序列 \(a_1,a_2,\ldots,a_n\),有 \(q\) 次操作,每次操作给你两个数 \(x,y\),你可以交换 \(a_x,a_y\),或者什么都不做. 问你所有 \(2^ ...