我的第三十篇博客---scrapy框架

scrapy安装需要一个异步模块Twisted,这个模块得自己手动安装

Twisted下载地址:https://blog.csdn.net/coco56/article/details/82145425

如果自己是python 37 -64位,可以下载这个网盘的文件 按需求选取

pycharm 安装: pip install Twisted存放的路径

打开cmd

运行 scrapy

出数据表示安装成功

不是内部命令,未安装

然后 需要升级 运行指令: pip install pypiwin32

搞定!

首先切换路径 到一个包里
cd _scrapy
创建一个工程
scrapy startproject myspider (这是工程名)
创建爬虫
首先啊要切换到这个工程里
cd myspider
再在这里面创建爬虫
scrapy genspider itcast itcast.cn
启动命令:scrapy crawl itcast (itcast是爬虫的名字 自己起的)

scrapy.cfg :项目的配置文件
mySpider/: 项目的python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py:项目的设置文件

return和yield区别

return 是直接就结束函数了 后面的代码不执行 每次都是重新执行 变量的值不变

yield 是这次函数结束后 下次在执行这个函数时就直接接着执行后面的内容

爬虫模块:

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

class ItcastSpider(scrapy.Spider):
name = ‘itcast‘
#这是爬虫的识别名称,必须是唯一的,在不同的爬虫中必须定义不同的名字

allowed_domains = [‘http://www.itcast.cn‘]
#这是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略
start_urls = [‘http://www.itcast.cn‘]

#爬取的URL列表,爬虫从这里面开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成

def parse(self, response):

#解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
1、负责解析返回的网页数据,提取结构化数据
2、生成需要下一页的URL请求
print(response)

管道文件就是处理item字段的

def __init__(self): 管道初始执行

def close_spider(self,spider): 爬虫结束执行

# -*- coding: utf-8 -*-
import scrapy
from ..items import ItcomItem

class ItcomSpider(scrapy.Spider):
name = ‘ITcom‘
allowed_domains = [‘citreport.com/news/it/‘]
start_urls = [‘http://www.citreport.com/news/it/‘]

def parse(self, response):
#标题
title = response.xpath(‘//*[@id="ct"]/div[1]/div[2]/div[2]/div/div/div/h2/a/text()‘).extract()
# print(title)
#文章链接
url = response.xpath(‘//*[@id="ct"]/div[1]/div[2]/div[2]/div/div/div/h2/a/@href‘).extract()
# print(url)
#图片链接
images = response.xpath(‘//*[@id="ct"]/div[1]/div[2]/div[2]/div/div/div[1]/a/img/@src‘).extract()
for index,values in enumerate(title):
item = ItcomItem()
item[‘title‘] = title[index] #标题
item[‘url‘] = url[index] #文章详情页地址
item[‘image_urls‘] = [images[index]] #图片链接
# meta是向下个方法里传递参数 以字典的形式 key:value 可以传递多个参数 dont_filter是url去重
yield scrapy.Request(url=url[index],callback=self.content_parse,method=‘GET‘,meta={‘item‘:item},dont_filter=True)
#获取详情页
def content_parse(self,response):
item = response.meta[‘item‘]
item1 = response.xpath(‘//p/text()‘).extract()
item[‘content2‘] = ‘‘.join(item1)
print(item[‘content2‘])
yield item

 管道文件pipelines.py:

import scrapy,os
from scrapy.pipelines.images import ImagesPipeline
from pymongo import MongoClient
import json

class FourPipeline(object):
def open_spider(self,spider):
self.client=MongoClient(host=‘localhost‘,port=27017)
self.collection=self.client[‘qimo‘][‘four‘]
def process_item(self, item, spider):
self.collection.insert_one(dict(item))
return item
def close_spider(self,spider):
self.client.close()

class CrawlImg(ImagesPipeline):
def get_media_requests(self, item, info):
yield scrapy.Request(url=item[‘img‘])
def item_completed(self, results, item, info):
img_path=‘‘.join([x[‘path‘] for ok,x in results if ok])
os.rename(‘./img/‘+img_path,‘./img/‘+item[‘title‘]+‘.jpg‘)
return item

class Write(object):
def open_spider(self,spider):
self.file=open(file=‘1.json‘,mode=‘a‘,encoding=‘utf8‘)
def process_item(self, item, spider):
json.dump(dict(item),self.file,ensure_ascii=False,indent=2)
return item
def close_spider(self,spider):
self.file.close()

settings.py:

ITEM_PIPELINES = {
‘four.pipelines.CrawlImg‘:1,
‘four.pipelines.FourPipeline‘: 300,   
‘four.pipelines.Write‘:200   #设置的数字越小优先级越高,即先执行
}
IMAGES_STORE=‘./img/‘

原文地址:https://www.cnblogs.com/sll-csdn/p/10926109.html

时间: 2024-11-04 12:34:26

我的第三十篇博客---scrapy框架的相关文章

我的第三十一篇博客---mongo

mongo 进入Mongoshow dbs 展示出mongo里数据库有哪些db 显示当前数据库use admin 切换到admin这个数据库show collections 展示里面的集合 db.info.insert({'name':'zhangsan','age':20}) 向当前数据库info列里插入这项数据db.info.find() 查询info里的数据db.dropDatabase() 删除当前的数据库 mongodb集合的命令不手动创建集合:向不存在的集合中第一次加入数据时,集合会

Xamarin几十篇博客,roslyn和dotnet也开源了

.Net 基金会 http://www.dotnetfoundation.org/ 更新的真快,刚打完2的补丁包,3就粗来了............ https://www.visualstudio.com/downloads/visual-studio-prerelease-downloads#sec1 https://www.visualstudio.com/en-us/downloads/visual-studio-2015-iso-sha1-vs.aspx iso  离线地址: http

我的第三十三篇博客---flask

使用框架的优点:稳定性和可扩展性强可以降低开发难度,提高了开发效率 在Python中常用的Web框架有:flaskdjangotornado Flask诞生于2010年,是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQL_Alchemy),都需要用第三方的扩展来实现.其WSGI工具箱采用Werkzeu

我的第二十篇博客---Mysql基本命令

explain select name from student where name='小明';查看查询了多少行才找到 alter database 数据库名 character set utf8;  将数据库的编码改为utf8create database 数据库名 charset=utf8;   创建数据库指定编码为utf8 当一个表数据全部删除时,id设有主键自增,truncate table 表名;下次id从1开始 原表数据全部删除 要是不想全部删除 则 alter table 表名

第十周博客总结

这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3162 我在这个课程的目标是 复习之前学过的内容 这个作业在哪个具体方面帮助我实现目标 网上课程 参考文献 C语言第三版第九章 一.刘未鹏的博客:怎样花两年时间面试一个人 http://mindhacks.cn/2011/11/04/how-to-interview-a-per

一篇博客分清shell中的状态返回值-return-break-continue-exit

一篇博客分清shell中的状态返回值-return-break-continue-exit 一.break.continue.exit.return的区别和对比 条件与循环控制及程序返回值命令知识表 命令 说明 break n 如果省略n,则表示跳出整个循环,n表示跳出循环的层数 continue n 如果省略n,则表示跳出本次循环,忽略本次循环剩余代码,进入循环的下一次循环.n表示退到第n层继续循环 exit n 表示退出当前shell程序,n为上一次程序执行的状态返回值,n也可以省略,在下一

一篇博客让你了解RxJava

RxJava可以说是2016年最流行的项目之一了,最近也接触了一下RxJava,于是想写一篇博客,希望能通过这篇博客让大家能对其进行了解,本篇博客是基于RxJava2.0,跟RxJava1.0还是有很多不同的 基础知识 RxJava的核心就是"异步"两个字,其最关键的东西就是两个: Observable(被观察者) Observer/Subscriber(观察者) Observable可以发出一系列的 事件,这里的事件可以是任何东西,例如网络请求.复杂计算处理.数据库操作.文件操作等等

[iOS]关于 App 混合(Hybrid)开发的优化,包括H5、Weex等(本篇博客主要针对 iOS 应用讲解,但该思想同样适用于Android)

我们知道混合开发,可以节省很多成本(时间成本,经济成本等等),所以有很多公司比较钟爱这种开发形式,今天所讲的优化方式,也是我在我们公司的应用中实际用了的,而且我写的这个优化的 SDK 已经开源到 github 上了,有兴趣的同学可以下载来看一下,有不足的地方欢迎指正.这里给出链接:https://. 转载请注明出处:http://www.cnblogs.com/shisishao/p/6830736.html -.首先,先介绍下什么是混合开发: 我们通常把移动开发分为Web.Native和Hyb

一篇博客彻底了解Android广播机制

首发于http://blog.csdn.net/pwiling/article/details/47682413,禁止转载 之前数次在程序中碰到Android广播,总是有这个疑问:往往是在发送广播的activity里面进行动态注册,动态注册必须要获得BroadcastReceiver对象,既然我们已经获得了广播接受器的对象,为何还要发送广播,直接用广播接收器的对象调用里面的相关逻辑处理的方法,不行吗?为什么还要绕这么一大圈用广播呢? 以前都是走马观花,这次弄清楚了.在解答这个问题之前,我们首先来