Python学习笔记(七)
Python爬虫框架
-
安装Scrapy框架
1、命令行 conda install scrapy 2、PYcharm setting -> project interpreter -> + 号,搜索scrapy ,install
爬虫工作基本原理——数据采集
大数据数据采集有两种:
1、从网上爬取 crawling
2、从本地收集 scraping
流程步骤:
1、模拟浏览器发送请求 : urllib,request,scrapy(框架)
2、获取浏览器的相应
3、解析响应内容 : lxml ,beautifulsoup
4、存储所需数据 : CSV,JSON,RDBMS(pymysql),Mongodb
=========================================================================
1、Request 的API
=========================================================================
1、发送请求
import requests as req
#发送请求,获取响应
reply=req.get("https://beijing.8684.cn/x_35b1e697")
2、获取响应
print(reply.content) #二进制的HTML ,用于xpath解析
print(reply.text) #字符HTML,用于正则解析
print(reply.status_code) #响应的状态码
============================================================================
2、lxml 的API
============================================================================
1.导包
from lxml import etree as et
2.解析HTML(二进制文件)
root=et.HTML(reply.content)
#XPATH语法
root.Xpath('//book').tag
3.demo
#request获取 + lxml解析
import requests as req
from lxml import etree as et
#发送请求,获取响应
reply=req.get("https://beijing.8684.cn/x_35b1e697")
#print(reply.content)
src=reply.content
root=et.HTML(src)
#非包装类,直接返回一个字符串型的列表list
print(root.xpath("//div[@class='bus_site_layer']/div/a/text()"))
Xpath语法
表达式 | 描述 |
---|---|
nodename | 选取的节点名 |
/ | 从根节点选取 |
// | 选取所有符合条件的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
[@attrib] | 选取所有包含指定属性的节点 |
[@attrib='value'] | 选取所有指定属性值为value的节点,也可以是其他逻辑运算符 |
[tag] | 所有子节点包含指定节点名的节点 |
[position] | 通过索引选取节点 |
/方法名() | 调用结点方法获取返回值list,不可直接在position后使用 |
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
exp1|exp2 | 或,多条件选取 |
==========================================================================
3、 Scrapy 框架
=========================================================================
官方指定测试网址:http://quotes.toscrape.com/
创建一个爬虫工程
1、创建一个目录,cmd中cd到该目录,然后创建工程scrapy startproject $youprojectname
2、创建一个Spider爬虫文件,scrapy genspider $youspidername $start_url
start_url 不能加https
默认的parse()方法是空
工程目录下的spider文件下生成$youspidername.py文件
导入到Pycharm 进行业务逻辑编写
3、启动爬虫spider :
cmd启动: scrapy crawl $youspidername
在py脚本中启动:
from scrapy.cmdline import execute
execute('scrapy crawl $youspidername'.split())
框架组成
-
spiders文件夹
- 定义爬虫文件
-
items.py
- 定义框架内数据传输格式
-
pipelines.py
- 数据保存模块
-
middlewares.py
- 中间件模块,代理服务
-
settings.py
- 框架配置模块
spider--> Scheduler --> downloader(middlewares) ->> spiders ->> itemPipeline
通过解析方法返回爬取页面数据
- parse()方法的response参数
- response对象常用属性和方法
- 返回都是Selector选择器类
属性或方法 | 作用 |
---|---|
url | 当前返回数据所对应的页面url |
status | http请求状态码 |
meta | 用于request与response之间的数据传递 |
body | 返回页面html源码,如用纯正则表达式匹配数据需要获得页面html源码 |
xpath() | 使用xpath选择器解析网页 |
css() | 使用css选择器解析网页 |
关于选择器
有三种:
- xpath选择器 基于lxml库,用于选择XML文档中的节点的语言,可以与HTML一起使用
- css选择器 用于将样式应用于HTML文档的语言 将样式与特定的HTML元素相关联
- 正则表达式 提取非标签内容
关于提取器
获取选择器中的网页数据data
extract() 提取selector列表中的网页数据 如果列表为空,取下标为0的网页数据会抛出异常 extract_first() 提取selector列表中下标为0的网页数据 如果列表为空,不会抛出异常,返回none
业务模块spiders.demo
# -*- coding: utf-8 -*-
import scrapy
from scrapy.cmdline import execute
class FirstscSpider(scrapy.Spider):
name = 'firstsc'
allowed_domains = ['www.kgc.cn']
start_urls = ['http://www.kgc.cn/']
def parse(self, response):
print('---------------------')
res=response.xpath('//p[@class="orientation"]/text()')
for item in res:
print(item)
print('---------------------')
execute('scrapy crawl firstsc'.split()) #py脚本执行scrapy
关于反爬虫(User_Agent 和 Cookies)
设置用户代理模拟浏览器,步骤:
1、使用浏览器打开一个网页,进入控制台--->Network --> Header -->拷贝最底部USER_Agent的值
2、scrapy工程中找到setting.py ,查找USER_AGENT 属性,去掉注释,粘贴赋值
设置COOKIE保持登录状态
1、自己使用浏览器登陆网页,然后进入要爬取的域名,进入F12控制台-->network->Doc -->域名同名文件
2、在文件中找到RequestHeader ,复制
3、在scrapt框架的settings.py文件中找到DEFAULT_REQUEST_HEADERS属性,将复制的内容以json格式赋值给它
4、关于settings中的Cookies的设置规则:
- 当COOKIES_ENABLED是注释的时候scrapy默认没有开启cookie
- 当COOKIES_ENABLED没有注释设置为False的时候scrapy默认使用了settings里面的cookie
- 当COOKIES_ENABLED设置为True的时候scrapy就会把settings的cookie关掉,使用自定义cookie
Tips:这样做有一个缺点是,默认所有Request都会使用该Cookies。能不能
关于翻页爬取的管理
在parse方法中使用yield方法,根据获取的url生成Request类,并指定这个Request的回调方法
关于详情页的获取
即子页面的获取
核心功能: 生成器、回调函数、meta
生成器:通过yied语法生成多个Request,调用Schedular获取页面的响应,
回调函数:指定该Request的回调函数,即处理这个Request的方法
meta:指定Request与Response的映射字典,使回调函数的Response能够获得对应Request对象
关于数据保存
1、在item模块中定义数据结构的字段,在spider中进行赋值
#item的定义方式
name = scrapy.Field()
age = scrapy.Field()
#赋值方式
obj=$youspidername+Item()
obj['name']="huyang"
2、在pipeline模块中过滤处理并将数据存储到仓库
命令行模式:-o filename
IDE模式:在爬虫模块的回调方法中使用生成器yield返回一个item类的实例对象,在settings.py中设置FEED_FORMAT='CSV' FEED_URI='d:/python.csv'
保存到CSV
保存到MySQL
1、重写pipelins.py
import pymysql
class ScrapydemoPipeline(object):
# 定义构造器,初始化要写入的文件
def __init__(self):
self.db = pymysql.connect(host="192.168.137.137", user="root", passwd="rw", db="scrapy", port=3306,
charset='utf8')
self.cur = self.db.cursor()
# 重写close_spider回调方法,用于关闭数据库资源
def close_spider(self, spider):
print('----------关闭数据库资源-----------')
# 关闭游标
self.cur.close()
# 关闭连接
self.db.close()
def process_item(self, item, spider):
#SQL语句
sql = """
insert into bus_line_site(`name`,`dicts`,`sites`) values(%s,%s,%s)
"""
self.cur.execute(sql, (item['name'], item['dicts'], item['sites']))
self.db.commit()
2、setting.py中关于ITEM_PIPELINE属性去掉注释,然后添加FEED_EXPORT_ENCODING = 'utf-8'
3、设置MYSQL表和数据的字符集为utf8
4、回调函数中要使用yield返回一个item类的实例