python网络爬虫与信息提取北京理工大学ppt_北京理工大学Python网络爬虫与信息抽取学习笔记10,信息提取...

Scrapy爬虫产生步骤

1、建立一个Scrarrpy爬虫工程

cmd命令提示符中选择目录

输入 scrapy start project name

#工程名不要含中文,否则之后生成爬虫时会报错

生成文件中的scrapy.cfg 部署Scrapy爬虫的配置文件

name/ Scrapy框架的用户自定义Python代码

_ init_.py 初始化脚本

items.py Items代码模板(继承类)

middlewares.cfg Middlewares代码模板(继承类)

pipelines.cfg Pipelines代码模板(继承类)

settings.cfg Scrapy爬虫的配置文件

spiders/ Spiders代码模板目录(继承类)

2、在工程中生成一个Scrapy爬虫

cmd命令提示符中选择建立的爬虫工程目录

输入scrapy genspider demo python123.io

生成文件demo.py

3、配置产生的spider爬虫

4、运行爬虫,爬取网页

cmd命令提示符中输入scrapy crawl desmon

(因为网站拒绝,所以运行失败)

# -*- coding: utf-8 -*-

import scrapy

class DesmonSpider(scrapy.Spider):

name = 'desmon'

allowed_domains = ['pthon123.io'] #访问的域名,只能爬取该域名下的

def start_requests(self):

urls={'http://pthon123.io/ws/demo.html'} #爬取页面的初始页面

for url in urls:

yield scrapy.Request(url=url,callback=self.parse)

def parse(self, response): #parse()用于处理响应,解析内容形成字典,发现新的URl爬取请求

fname=response.url.split('/')[-1]

with open(fname,'wb') as f:

f.write(response.body)

self.log('Save file %s.'% name)

yield关键字

yield与生成器相关

生成器是一个不断产生值的函数

包含yield语句的函数是一个生成器

生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值

生成器相比一次列出所有内容的优势

更节省存储空间

响应更迅速

使用更灵活

Scrapy爬虫的基本使用

1、创建一个工程和Spider模板

2、编写Spider

3、编写Item Pipelines

4、优化配置策略

Request类

Request对象表示一个HTTP请求

由Spider生成,由Downloader执行

.url Request对应的请求URL地址

.method 对应的请求方法,‘GET’‘POST’等

.headers 字典类型风格的请求头

.body 请求内容主体,字符串类型

.meta 用户添加的扩展信息,在Scrapy内部模板间传递信息使用

.copy() 复制该请求

Respons类

Response对象表示一个HTTP相应

由Downloader生成,由Spider处理

.url Response对应的URL地址

.status HTTP状态码,默认为200

.headers Respose对应的头部信息

.body Response对应的内部信息,字符串类型

.flags 一组标记

.request 产生Response类型对应的Request对象

.copy() 复制该响应

Item类

Item对象表示一个从HTML页面中提取的信息内容

由Spider生成,由Item Pipelines处理

Item类似字典类型,可以按照字典类型操作

Scrapy爬虫支持多种HTML信息提取方法

Beautiful Soup

lxml

re

XPath Selector

CSS Selector

CSS Selector的基本使用

< HTML>.css(‘a::attr(href)’).extract() #a为标签名,href为标签属性

编写spider

class StockSpider(scrapy.Spider):

name = 'stock'

allowed_domains = ['baidu.com']

start_urls = ['http://quote.eastmoney.com/stocklist.html']

def parse(self, response):

for href in response.css('a::attr(href)').extract:

try:

stock=re.findall(r"[s][hz]\d{6}",href)[0]

url='https://guopiao.baidu.com/stock/'+stock+'.html'

yield scrapy.Request(url,callback=self.parse_stock)

except:

continue

def parse_stock(self,response):

infoDict={}

stockInfo=response.css('.stock-bets')

name=stockInfo.css('.bets-name').extract()[0]

keyList=stockInfo.css('dt').extract()

valueList=stockInfo.css('dd').extract

for i in range(len(keyList)):

key=re.findall(r'>.*

try:

val=re.findall(r'\d+\.?.*',valueList[i])[0][0:5]

except:

val='--'

infoDict[key]=val

infoDict.update({"股票名称":re.findall('\s.*\(',name)[0].split()[0]+

re.findall('\>.*

yield infoDict

编写piplines.py

class CestPipeline(object): #cest为工程名

def process_item(self, item, spider):

return item

class BaidustocksInfoPipeline(object):

def open_spoder(self,spider):

self.f=open('BaiduStockInfo.txt','w')

def close_spoder(self,spider):

self.f.close()

def process_item(self,item,spider):

try:

line=str(dict(item))+'\n'

self.f.write(line)

except:

pass

return item

优化settings.py

找到

#ITEM_PIPELINES = { 'CEST.pipelines.CestIPpeline': 300, }

修改为

ITEM_PIPELINES = { 'CEST.pipelines.CestIPInfopeline': 300, }

命令提示符中运行

scrapy crwal stock

配置并发连接选项

CONCURRENT_REQUESTS Downloader最大并发请求下载数量,moren32

CONCURRENT_ITEMS Item Pipeline最大并发ITEM处理数量,默认100

CONCURRENT_REQUESTS_PER_DOMAIN 每个目标名最大的并发请求数量,默认8

CONCURRENT_REQUESTS_PER_IP 每个目标IP最大的并发请求数量,默认0,非0有效

ps:实例仅供参考,因为网页原因不能爬取

ps:学习链接 https://www.icourse163.org/learn/BIT-1001870001?tid=1206951268#/learn/announce

你可能感兴趣的:(python网络爬虫与信息提取北京理工大学ppt_北京理工大学Python网络爬虫与信息抽取学习笔记10,信息提取...)