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)