7.selenium收尾工作以及认识scrapy


模拟手机操作

# 引入触控类
from selenium.webdriver.common.touch_actions import TouchActions
mobileEmulation = {'deviceName':'iPhone 6/7/8'}
options = webdriver.ChromeOptions()
options.add_experimental_option('mobileEmulation',mobileEmulation)
#关闭w3c模式,非常重要,否则无法进行模拟点击操作
options.add_experimental_option('w3c',False)
#点击坐标操作
action =TouchActions(driver)
action.tap_and_hold(75,125).release(75,125).perform()

如果在其他地方放开就是拖拽,原处放开就是点击

double_tap   # 双击
filck_element   # 从某个元素开始以指定速度移动
long_press   # 长按
move   # 移动到指定位置
perform   # 执行动作链,所有动作最后都要perform
release   # 手指松开
scroll   # 滚动
tap   # 单击,轻点
# 清除input标签(输入框)里所有的value
sell1 = driver.find_element_by_xpath("//input[@id='j-input']")
driver.execute_script("arguments[0].value='';",sell1)

爬虫框架——scrapy

提取结构性的数据而编写的框架,使用少量代码快速获取东西

scrapy工作流程:
1.生成一个爬取的url list
2.通过请求获取响应内容,并且根据响应内容再次提取url,送回url list中
3.根据响应内容获取数据
4.入库

爬虫框架工作流程:
1.调度器把requests-->引擎-->下载中间件-->下载器
2.下载器发送请求,获取响应-->下载中间件--->引擎--->调度器
3.爬虫提取url地址,组成request对象--->爬虫中间件--->引擎--->调度器
4.爬虫提取数据--->引擎-->管道(pipelines)
5.管道提醒数据处理和保存

# 安装scrapy和pypiwin32
# 在代码保存位置新建一个bat文件,用于打开cmd,在cmd中新建项目
scrapy startproject test1
# 新建一个项目test1

spiders文件夹 = 所有的爬虫都会放在这里面
items.py = 定义一些爬取的数据模型
middlewares.py = 爬虫中间件
pipelines.py = 将items的模型存储到本地的磁盘中
settings.py = 设置请求头信息(伪装和代理等)

cd test1
scrapy genspider spider1 "[4399dmw.com](http://4399dmw.com/)"
# 生成一个爬虫

因为工作目录就在当前目录下,所有将test1文件标记为来源目录,防止引入出现问题

在settings里修改为 ROBOTSTXT_OBEY = False ,即不遵从robots协议,什么都要爬

修改DEFAULT_REQUEST_HEADERS

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'zh-CN,zh;q=0.9',
}

运行爬虫

scrapy crawl spider1

在创建的文件夹下爬取会自动寻找到spider1位置,可以见scrapy.cfg,这个spider1就是刚刚生成的

Json写入

settings.py去除注释

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'zh-CN,zh;q=0.9',
}

#  每次yield时使用哪一条pipeline
ITEM_PIPELINES = {
   'test1.pipelines.Test1Pipeline': 300,
}

spider1.py

import scrapy
from test1.items import Test1Item

class Spider1Spider(scrapy.Spider):
    # 爬虫根据这个名字运行
    name = 'spider1'
    # 允许的域名
    allowed_domains = ['4399dmw.com']
    # 从什么域名开始
    start_urls = ['http://www.4399dmw.com/donghua/']

    def parse(self, response):
        # //div[@class='u-ct']/p[@class='u-tt']/text()
        datas = response.xpath("//div[@class='u-ct']/p[@class='u-tt']/text()")
        for item in datas:
            print(item.get())

            # 使用item来存储
            topipeline1 = Test1Item(title = item.get())

            yield topipeline1

				# 找到下一页的链接,翻页
        next_url = response.xpath("//a[@class='next']/@href").get()
        if not next_url:
            return
        else:
            # 返回继续执行方法,通过回调函数执行parse函数
            yield scrapy.Request("http://www.4399dmw.com/"+next_url,callback=self.parse)

items.py

import scrapy

class Test1Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 在items定义数据类型
    title = scrapy.Field()

pipelines.py

import json

class Test1Pipeline:
    # 打开爬虫的时候执行
    def open_spider(self,spider):
        # 打开并准备存储
        self.fp = open("spider1.json","w",encoding='utf-8')

    # 使用yield时候执行
    def process_item(self, item, spider):
        item_json = json.dumps(dict(item),ensure_ascii=False)
        # item_json = json.dumps(item,ensure_ascii=False)
        self.fp.write(item_json+'\n')
        return item

    # 爬虫结束时候执行
    def close_spider(self,spider):
        # 结束关闭文件
        self.fp.close()

Json导出(不适合数据量很大)

from scrapy.exporters import JsonItemExporter,JsonLinesItemExporter

class Test1Pipeline:
    # 打开爬虫的时候执行
    def open_spider(self,spider):
        # 打开并使用二进制存储
        self.fp = open("spider1.json","wb")
				# Item导出为一行,Lines效果跟换行写入一样
        self.explorer = JsonItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')
        self.explorer.start_exporting()

    # 使用yield时候执行
    def process_item(self, item, spider):
        self.explorer.export_item(item)
        return item

    # 爬虫结束时候执行
    def close_spider(self,spider):
        self.explorer.finish_exporting()
        # 结束关闭文件
        self.fp.close()

post发送数据进行登陆操作

def start_requests(self):
        url = "http://xxx.com"
        data = {"username":"admin","password":"admin"}
        # 请求地址和数据,进行回调
        request = scrapy.FormRequest(url,formdata=data,callback=self.parse_login)
        yield request

    def parse_login(self,reponse):
        with open("a.html","w",encoding='utf-8') as fp:
            fp.write(reponse.text)