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

    • 框架配置模块

1565750916521

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类的实例

动态页面爬取???

原文地址:https://www.cnblogs.com/whoyoung/p/11424204.html