爬虫scrapy模块

首先下载scrapy模块

这里有惊喜

https://www.cnblogs.com/bobo-zhang/p/10068997.html

创建一个scrapy文件

首先在终端找到一个文件夹

输入

scrapy startproject jy (项目件名)

修改setting文件配置

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'# Obey robots.txt rules
ROBOTSTXT_OBEY = Fals

 

cd 到 spiders文件,在终端创建一个文件

scrapy genspider myjy(文件名) www.xxx.com

 

在文件里执行我们的第一个代码吧

 

#实现解析+持久化存储

 
# -*- coding: utf-8 -*-
import scrapy


class FirstSpider(scrapy.Spider):
#爬虫文件的名称
name = 'first'
#允许的域名
#allowed_domains = ['www.xxx.com']
#起始url列表
start_urls = ['https://www.qiushibaike.com/text/']
#实现了数据的基本解析操作
# def parse(self, response):
# div_list = response.xpath('//div[@id="content-left"]/div')
# for div in div_list:
# #author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
# #如果可以保证xpath返回的列表中只有一个列表元素则可以使用extract_first(),否则必须使用extract()
# author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
# content = div.xpath('./a[1]/div/span//text()').extract()
# content = ''.join(content)
# print(author,content)

#实现解析+持久化存储
#1.基于终端指令的持久化存储
# 只可以将parse方法的返回值持久化存储到本地的文本中
#2.基于管道的持久化存储


# 1.基于终端指令的持久化存储
def parse(self, response):
div_list = response.xpath('//div[@id="content-left"]/div')
all_data = []
for div in div_list:
#author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
#如果可以保证xpath返回的列表中只有一个列表元素则可以使用extract_first(),否则必须使用extract()
author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
content = div.xpath('./a[1]/div/span//text()').extract()
content = ''.join(content)

dic = {
'author':author,
'content':content
}

all_data.append(dic)

return all_data

 

 

最后运行文件

scrapy crawl myjy

 

 

 

#解析+管道持久化存储

 

首先在psrse里写入文件

# -*- coding: utf-8 -*-
import scrapyfrom bossPro.items import BossproItem
class BossSpider(scrapy.Spider):name = 'boss'# allowed_domains = ['www.xxx.com']start_urls = ['https://www.zhipin.com/job_detail/?query=python%E7%88%AC%E8%99%AB&scity=101010100&industry=&position=']url = 'https://www.zhipin.com/c101010100/?query=python爬虫&page=%d&ka=page-2'page = 1#解析+管道持久化存储def parse(self, response):li_list = response.xpath('//div[@class="job-list"]/ul/li')for li in li_list:job_name = li.xpath('.//div[@class="info-primary"]/h3/a/div/text()').extract_first()salary = li.xpath('.//div[@class="info-primary"]/h3/a/span/text()').extract_first()company = li.xpath('.//div[@class="company-text"]/h3/a/text()').extract_first()#实例化一个item对象item = BossproItem()#将解析到的数据全部封装到item对象中item['job_name'] = job_nameitem['salary'] = salaryitem['company'] = company#将item提交给管道yield itemif self.page <= 3:print('if 执行!!!')self.page += 1new_url = format(self.url%self.page)print(new_url)#手动请求发送yield scrapy.Request(url=new_url,callback=self.parse)

 

配置items.py文件,用来作为数据结构

import scrapyclass BossproItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()job_name = scrapy.Field()salary = scrapy.Field()company = scrapy.Field()

 

 

在pipelines.py里写入文件

# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport pymysql
from redis import Redis
class BossproPipeline(object):fp = Nonedef open_spider(self, spider):print('开始爬虫......')self.fp = open('./boss.txt','w',encoding='utf-8')def close_spider(self, spider):print('结束爬虫......')self.fp.close()#爬虫文件每向管道提交一次item,则该方法就会被调用一次.#参数:item 就是管道接收到的item类型对象def process_item(self, item, spider):#print(item)self.fp.write(item['job_name']+':'+item['salary']+':'+item['company']+'\n')return item #返回给下一个即将被执行的管道类class mysqlPileLine(object):conn = Nonecursor =Nonedef open_spider(self,spider):self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='',db='scrapy',charset="utf8")print(self.conn)def process_item(self, item, spider):self.cursor = self.conn.cursor()# print(item)#print('insert into boss values ("%s","%s","%s")'%(item['job_name'],item['salary'],item['company']))try:print('insert into boss values ("%s","%s","%s")'%(item['job_name'],item['salary'],item['company']))self.cursor.execute('insert into boss values ("%s","%s","%s")'%(item['job_name'],item['salary'],item['company']))self.conn.commit()except Exception as e:print(e)self.conn.rollback()def close_spider(self,spider):self.conn.close()self.cursor.close()class redisPileLine(object):conn = Nonedef open_spider(self,spider):self.conn = Redis(host='127.0.0.1',port=6379)print(self.conn)def process_item(self, item, spider):# print(item)dic = {'name':item['job_name'],'salary':item['salary'],'company':item['company']}self.conn.lpush('boss',dic)

 

 

别忘了在setting里面配置

 

 

ITEM_PIPELINES = {# 'boss.pipelines.BossPipeline': 300,'boss.pipelines.redisPipeline': 301,# 'boss.pipelines.mysqlPipeline': 302,
}

 

转载于:https://www.cnblogs.com/zhangqing979797/p/10458393.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python canvas画移动物体_如何实现Canvas图像的拖拽、点击等操作

上一篇Canvas的博文写完后&#xff0c;有位朋友希望能对Canvas绘制出来的图像进行点击、拖拽等操作&#xff0c;因为Canvas绘制出的图像能很好的美化。好像是想做炉石什么的游戏&#xff0c;我也没玩过。Canvas在我的理解中就好像在一张画布上绘制图像&#xff0c;它只能看到却…

Git基础知识教程整理(Git基本操作)

Git简介 Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;。Linux之父Linux用C语言写了Git分布式版本控制系统。 分布式版本控制系统与集中式版本控制系统的区别 区别分布式集中式中央服务器有&#xff0c;版本库集中存放在中央服务器&#xff0c;工…

python plot map_使用matplotlibbasemap在边界打印

我在绘制多边形时遇到了困难&#xff0c;例如&#xff0c;在使用matplotlib basemap生成的地图边界上绘制多边形。在下面的示例中&#xff0c;地图边界由日期线指定。我试图通过指定三角形顶点的坐标来绘制一个跨越日期线的三角形。当所有的坐标都在地图内时&#xff0c;这种方…

SQL查询语句 group by后, 字符串合并

合并列值 --******************************************************************************************* 表结构&#xff0c;数据如下&#xff1a; id value ----- ------ aa bb aaa bbb ccc 需要得到结果&#xff1a; id values ------ ----------- aa,bb aaa…

Git 基础 —— 常用命令

Git 基础学习系列 Git 基础 —— 安装 配置 别名 对象Git 基础 —— 常用命令Git 基础 —— 常见使用场景Git基础 —— Github 的使用git init 创建 Git 本地仓库 远端无仓库&#xff0c;本地无仓库&#xff0c;本地新建一个仓库 git init git_learning 远端有仓库&#xff0c;…

python安装caffe_Linux下caffe的安装

下载caffe并保存到一个目录下(推荐放到 /home 目录)安装依赖项&#xff1a;sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compilersudo apt-get install --no-install-recommends libboost-all-devsudo apt-…

linux 访问Windows 共享文件的方法

2019独角兽企业重金招聘Python工程师标准>>> 1 安装Samba服务 2 启动 samba服务 /etc/init.d/smb restart 3 安装插件 cifs解决只读挂载&#xff1a;yum install cifs-utils.x86_64 4 在windows下共享一个可以用的文件夹 5 将 windows 共享文件夹挂载到linux上 命令…

基于Blink构建亲听项目以及全链路debug项目实时响应能力

案例与解决方案汇总页&#xff1a;阿里云实时计算产品案例&解决方案汇总 本文全面总结了大数据项目组在亲听项目以及全链路debug项目上进行的实时流处理需求梳理&#xff0c;架构选型&#xff0c;以及达成效果 一、背景介绍 1.1亲听项目 亲听项目专注于帮助用户收集、展示、…

python的重点_python知识点

"""author:lei"""import os#os.path.join() 将分离的部分合成一个整体filenameos.path.join(/home/ubuntu/python_coding,split_func)print filename#输出为&#xff1a;/home/ubuntu/python_coding/split_func#os.path.splitext()将文件名和扩展…

在既有系统中打通Apache Ignite、MySQL和Node.js

为什么80%的码农都做不了架构师&#xff1f;>>> 介绍 在本系列的第一篇文章中&#xff0c;安装了Node.js、Ignite的Node.js瘦客户端包&#xff0c;并且测试了一个示例应用。在本文中&#xff0c;可以看一下Ignite在处理其它数据源&#xff08;比如关系数据库&#…

java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

一、集合Collection1. 集合介绍变量&#xff1a;表示的内存中的一个空间&#xff0c;只能保存确定类型的单个数据数组&#xff1a;表示的是内存中的多个连续的空间&#xff0c;这些空间中可以存储多个同类型的数据。后期继续学习面向对象技术&#xff0c;我们在程序中开始创建对…

Vue进阶知识笔记

利用v-for循环出的多个li标签&#xff0c;点击不同的li变换颜色 方法一 <ul v-for"(item,index) in list" :key"index" class"details"><li ref"lisd" click"faillist(index)" :class"{active:ind index}&qu…

teamcity mysql 配置_CentOS 7 上 TeamCity 安装

CentOS 7 上 TeamCity 安装非入门教程, 初次接触centos/docker的朋友需要谨慎一. 安装 MySQL为了后续的需要, 这里安装了 Docker, 当然如果你已经有了 MySQL 或者其它推荐的数据库[MySQL, PostgreSQL, Oracle, MS SQL], 则可忽略1. 安装 Docker补充:# 启动dockersudo systemctl…

Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)

本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注&#xff0c;每个工作日都有文章更新。 一、概况 接着上篇说&#xff0c;如果你真以为Requests网络请求库只有Get请求和Post请求&#xff0c;那就大错特错了。它还一些其他用法&…

dbunit java_java - 错误地抛出了Java DBUnit AmbiguousTableNameException - 堆栈内存溢出

我正在尝试DBUnit(2.6.0)&#xff0c;我正在尝试导出我的完整数据库(PostgreSQL)。 但是抛出以下异常&#xff1a;线程“main”中的异常org.dbunit.database.AmbiguousTableNameException&#xff1a;FLYWAY_SCHEMA_HISTORY这是正确的行为&#xff0c;因为我有两个具有相同名称…

Docker 命令详解(run篇)

参考&#xff1a;https://www.cnblogs.com/yfalcon/p/9044246.html 命令格式&#xff1a;docker run [OPTIONS] IMAGE [COMMAND] [ARG...]Usage: Run a command in a new container中文意思为&#xff1a;通过run命令创建一个新的容器&#xff08;container&#xff09; 常用选…

java 同步 lock_关于java:同步是否像Lock.lock()一样驻留并发线程?

当我们调用lock.lock()或尝试输入synchronized块时&#xff0c;如果其他某个线程已经获得了该锁&#xff0c;则我们的线程将阻塞。 现在我的问题是&#xff0c;当我们查看lock.lock()的实现时&#xff0c;它会将获取锁委托给AQS&#xff0c;而AQS实际将当前线程驻留在该线程中(…

Idea项目中常见错误及笔记(Old)

1、Idea基础设置&#xff1a; File-->settings--> 1>修改字体&#xff1a;Font 2>修改编码格式&#xff1a;File Encodings(全部UTF-8,右下方复选框勾中--防止程序中的汉字转为ASCII码) 3>修改行号&#xff1a;Appearance&#xff1a;show line numbers show me…

java接口服务编排_GOKU API Gateway CE V3.1.0 发布:新增服务编排、配置版本管理等...

Goku API Gateway (中文名&#xff1a;悟空 API 网关)是一个基于 Golang 开发的微服务网关&#xff0c;能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的&#xff0c;拥有强大的自定义插件系统可以自行扩展&#xff0c;并且提供友好的图形化配置界…

maxcompute 2.0复杂数据类型之array

2019独角兽企业重金招聘Python工程师标准>>> 1. 含义 类似于Java中的array。有序、可重复。 2. 场景 什么样的数据&#xff0c;适合使用array类型来存储呢&#xff1f;这里列举了几个我在开发中实际用到的场景。 2.1 标签类的数据 为什么说标签类数据适合使用array类…