移动端数据爬取

注:抓包工具:青花瓷

  1. 1.配置fiddler
  2. 2.移动端安装fiddler证书
  3. 3.配置手机的网络
  4. - 给手机设置一个代理IP:port

a. Fiddler设置

打开Fiddler软件,打开工具的设置。(Fiddler软件菜单栏:Tools->Options)

在HTTPS中设置如下:

在Connections中设置如下,这里使用默认8888端口,当然也可以自己更改,但是注意不要与已经使用的端口冲突:

Allow remote computers to connect:允许别的机器把请求发送到fiddler上来

b. 安全证书下载

在电脑浏览器中输入地址:http://localhost:8888/,点击FiddlerRoot certificate,下载安全证书:

也可以

c. 安全证书安装(证书一定要安装且信任)

证书是需要在手机上进行安装的,这样在电脑Fiddler软件抓包的时候,手机使用电脑的网卡上网才不会报错。

Android手机安装:把证书放入手机的内置或外置存储卡上,然后通过手机的"系统安全-》从存储设备安装"菜单安装证书。

然后找到拷贝的FiddlerRoot.cer进行安装即可。安装好之后,可以在信任的凭证中找到我们已经安装好的安全证书。

苹果手机安装:

- 保证手机网络和fiddler所在机器网络是同一个网段下的

- 在safari中访问http://fiddle机器ip:fiddler端口,进行证书下载。然后进行安装证书操作。

- 在手机中的设置-》通用-》关于本机-》证书信任设置-》开启fiddler证书信任

d. 局域网设置

想要使用Fiddler进行手机抓包,首先要确保手机和电脑的网络在一个内网中,可以使用让电脑和手机都连接同一个路由器。当然,也可以让电脑开放WIFI热点,手机连入。这里,我使用的方法是,让手机和电脑同时连入一个路由器中。最后,让手机使用电脑的代理IP进行上网。 在手机上,点击连接的WIFI进行网络修改,添加代理。进行手动设置,ip和端口号都是fiddler机器的ip和fiddler上设置的端口号。

e. Fiddler手机抓包测试

上述步骤都设置完成之后,用手机浏览器打开百度首页,我们就可以顺利抓包了

scrapy框架

(1)环境安装

  1. linux:
  2. pip install scrapy
  3. windows:
  4. whell才能下载下载twisted框架: pips install whell
  5. 下载twisted框架(处理并发相关操作) : http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
  6. 进入下载目录,执行: pip3 install Twisted-17.1.0-cp35-cp35m-win_amd64.whl
  7. pip3 install pywin32
  8. pip3 install scrapy

(2)新建一个项目

创建一个工程

  1. scrapy startproject 工程名称

此时生成的工程目录

创建一个爬虫文件

注:要保证配置文件创建在当前工程目录下

  1. cd firstblood #在工程目录下创建爬虫文件 会在apiders中出现
  2. scrapy genspider first www.xxx.com #first代表爬虫文件的名称,www.xxx.com代表起始url

在first.py爬虫文件中

执行爬虫文件

  1. scrapy crawl first
  2. scrapy crawl first --nolog (不打印日志)

robots反爬机制的处理

被robots反爬机制拦截的反应

处理方式(在配置文件中修改此条为False)

User-Agent伪装反爬机制的处理

处理方式(在配置文件中修改此条)

数据解析

xpath表达式的使用以及获取Selector对象中的date中的值的两种方式
  1. class FirstSpider(scrapy.Spider):
  2. name = 'first'
  3. # allowed_domains = ['www.xxx.com'] #在该文件中,只能爬取这个域名之下的url,通常注释掉这一句
  4. start_urls = ['https://www.qiushibaike.com/text/']
  5. def parse(self, response):
  6. div_list=response.xpath('//div[@id="content-left"]/div')
  7. for div in div_list:
  8. #得到的div是Selector类型的
  9. title=div.xpath('./div/a[2]/h2/text()')[0].extract() #将Selector对象中的date中的值
  10. title = div.xpath('./div/a[2]/h2/text()').extract_first() #直接得到列表中第0个元素
  11. print(title)

持久化存储

1.基于终端指令的持久化存储(只能将path的返回值存到本地的文本中)

可以通过将终端指令的形式将parse方法的返回值中存储的数据进行本地磁盘的持久化存储

  1. class FirstSpider(scrapy.Spider):
  2. name = 'first'
  3. start_urls = ['https://www.qiushibaike.com/text/']
  4. def parse(self, response)
  5. div_list=response.xpath('//div[@id="content-left"]/div')
  6. all_data=[]
  7. dic={}
  8. for div in div_list:
  9. #得到的div是Selector类型的
  10. content=div.xpath('./a/div/span/text()').extract_first()
  11. title=div.xpath('./div/a[2]/h2/text()').extract_first()
  12. dic={
  13. "title":title,
  14. "content":content
  15. }
  16. all_data.append(dic)
  17. print(all_data)
  18. return all_data

终端指令

  1. scrapy crawl first -o qiubai.csv

注:限制文件存储的格式,只能是json,jsonlines,jl,csv,xml,marshal,pickle格式的文件

2.基于管道的持久化存储

新建工程

  1. scrapy startproject bosspro
  2. cd bosspro

创建爬虫文件

  1. scrapy genspider boss www.baidu.com

修改两种反爬机制

爬取Boss直聘的数据

  1. class BossSpider(scrapy.Spider):
  2. name = 'boss'
  3. #allowed_domains = ['www.baidu.com']
  4. start_urls = ['https://www.zhipin.com/job_detail/?query=python爬虫&scity=101010100&industry=&position=']

  5. def parse(self, response):
  6. li_list=response.xpath('//*[@id="main"]/div/div[3]/ul/li')
  7. for li in li_list:
  8. name=li.xpath('./div/div/h3/a/div/text()').extract_first()
  9. salary=li.xpath('./div/div/h3/a/span/text()').extract_first()
管道的使用

在items.py中

  1. import scrapy
  2. class BossproItem(scrapy.Item):
  3. # define the fields for your item here like:
  4. # name = scrapy.Field()
  5. name = scrapy.Field() # 1.将爬虫文件中每一个要提交给管道的数据封装成这个类下的一个属性
  6. salary = scrapy.Field(

在boss.py爬虫文件中

  1. import scrapy
  2. from bosspro.items import BossproItem #2.导入item中的类

  3. class BossSpider(scrapy.Spider):
  4. name = 'boss'
  5. #allowed_domains = ['www.baidu.com']
  6. start_urls = ['https://www.zhipin.com/job_detail/?query=python爬虫&scity=101010100&industry=&position=']

  7. def parse(self, response):
  8. li_list=response.xpath('//*[@id="main"]/div/div[3]/ul/li')
  9. for li in li_list:
  10. name=li.xpath('./div/div/h3/a/div/text()').extract_first()
  11. salary=li.xpath('./div/div/h3/a/span/text()').extract_first()
  12. item=BossproItem() #3.实例化一盒item对象
  13. item['name']=name #4.将解析到的数据存储到item对象中
  14. item['salary']=salary
  15. yield item #5.将item对象提交给管道

在pipelines.py管道文件中

  1. #此文件需要接受爬虫文件提交过来的数据,并对数据进行持久化存储(IO)
  2. class BossproPipeline(object):
  3. #爬虫文件每提交一次,该方法执行一次
  4. def process_item(self, item, spider):
  5. print(item['name'])
  6. print(item['salary']) #6.在process_item函数中进行数据的持久化存储
  7. return item

在settings.py配置文件中

  1. #7.在配置文件中开启管道
  2. ITEM_PIPELINES = {
  3. 'bosspro.pipelines.BossproPipeline': 300, #300表示的是优先级,数值越小优先级越高
  4. }
  5. #pipelines中声明的管道类都要在此处开启
数据的持久化存储(本地,mysql,redis)
  1. #将数据保存到本地
  2. class BossproPipeline(object):
  3. f=None
  4. # open_sipder只会在开始爬虫时执行一次
  5. def open_spider(self,spider): #此处的spider是BossSpider类的一个实例对象
  6. print("开始爬虫!")
  7. self.f= open('./job.txt','w',encoding='utf-8')
  8. def process_item(self, item, spider):
  9. self.f.write(item['name']+':'+item['salary']+"\n")
  10. return item #如果有其他的管道,process_item函数一定要有返回值
  11. #close_sipder只会在结束爬虫时执行一次
  12. def close_spider(self,spider):
  13. print("结束爬虫!")
  14. self.f.close()

  15. #将数据保存到mysql
  16. import pymysql
  17. class Bosspro_mysql_Pipeline(object):
  18. conn=None #连接对象
  19. cursor=None #游标对象
  20. def open_spider(self,spider):
  21. self.conn=pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='',db='pachong')
  22. print("开始爬虫")
  23. print(self.conn)
  24. def process_item(self, item, spider):
  25. self.cursor=self.conn.cursor()
  26. sql='insert into boss values("%s","%s")' % (item["name"],item["salary"])
  27. try:
  28. self.cursor.execute(sql)
  29. self.conn.commit()
  30. print(sql)
  31. except Exception as e:
  32. print(e)
  33. self.conn.rollback() #事务回滚
  34. return item
  35. def close_spider(self,spider):
  36. self.cursor.close()
  37. self.conn.close()
  38. print('结束爬虫')

  39. #将数据保存到redis
  40. from redis import Redis
  41. class Bosspro_redis_Pipeline(object):
  42. conn=None
  43. def open_spider(self,spider):
  44. self.conn=Redis(host='127.0.0.1',port=6380)
  45. print("开始爬虫了")
  46. print(self.conn)
  47. def process_item(self, item, spider):
  48. dic={
  49. "name":item["name"],
  50. "title":item["salary"]
  51. }
  52. self.conn.lpush('Info',dic)
  53. def close_spider(self,spider):
  54. print('结束爬虫了')

注:开启线程

在配置文件中修改CONCURRENT_REQUESTS = 32即可

 

移动端数据爬取和Scrapy框架的更多相关文章

  1. 小爬爬5:重点回顾&&移动端数据爬取1

    1. ()什么是selenium - 基于浏览器自动化的一个模块 ()在爬虫中为什么使用selenium及其和爬虫之间的关联 - 可以便捷的获取动态加载的数据 - 实现模拟登陆 ()列举常见的sele ...

  2. 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取

    爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...

  3. 移动端数据爬取(fidlde)

    一.什么是Fiddler? 1 什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一 . 它能够记录客户端和服务器之间的所有 HTTP请求, ...

  4. Scrapy 框架 CrawlSpider 全站数据爬取

    CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...

  5. quotes 整站数据爬取存mongo

    安装完成scrapy后爬取部分信息已经不能满足躁动的心了,那么试试http://quotes.toscrape.com/整站数据爬取 第一部分 项目创建 1.进入到存储项目的文件夹,执行指令 scra ...

  6. requests模块session处理cookie 与基于线程池的数据爬取

    引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...

  7. Python3,x:如何进行手机APP的数据爬取

    Python3,x:如何进行手机APP的数据爬取 一.简介 平时我们的爬虫多是针对网页的,但是随着手机端APP应用数量的增多,相应的爬取需求也就越来越多,因此手机端APP的数据爬取对于一名爬虫工程师来 ...

  8. Web Scraper——轻量数据爬取利器

    日常学习工作中,我们多多少少都会遇到一些数据爬取的需求,比如说写论文时要收集相关课题下的论文列表,运营活动时收集用户评价,竞品分析时收集友商数据. 当我们着手准备收集数据时,面对低效的复制黏贴工作,一 ...

  9. 基于CrawlSpider全栈数据爬取

    CrawlSpider就是爬虫类Spider的一个子类 使用流程 创建一个基于CrawlSpider的一个爬虫文件 :scrapy genspider -t crawl spider_name www ...

随机推荐

  1. android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖?

    android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖? 分析原因: 主要是由于.我之前的 SDK 的版本号 更新的有点高了.低版本号是不会有这样的问题g的,新版本号中g ...

  2. javascript对象属性为空的判断

    zepto: $.isEmptyObject = function(obj) { var name for (name in obj) return false return true } $.isE ...

  3. 一组西门子S7 报文

    03 00 00 16 11 E0 00 00 00 01 00 C1 02 10 00 C2 02 03 01 C0 01 0A(第一次握手报文) 03 00 00 16 11 D0 00 01 0 ...

  4. hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书

    代码测试环境:Hadoop2.4 应用场景:当需要处理非常多的小数据文件,这种技术的目的,可以被应用到实现高效的数据处理. 原理:申请书CombineFileInputFormat,能够进行切片合并的 ...

  5. C#并发集合

    并发集合   并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组 ...

  6. Qt5官方demo解析集35——Music Player(使用winextras模块)

    本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集34——Concentr ...

  7. Robot Framework 快速入门_英文版

    Copyright © Nokia Siemens Networks 2008 Licensed under the Apache License, Version 2.0 Table of Cont ...

  8. sql语句计算出每个月的天数

    原文:sql语句计算出每个月的天数   从当前月-11个月开始,到当前月为止,用一个sql语句计算出每个月的天数. SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-LEVEL+1 ...

  9. Matlab Tricks(二十二)—— 自定义函数

    printme = @(txt) print('-dpdf', sprintf('figures/Example_%s',txt)); % 这里的 print 显然不是控制台输出一句话,而是图像的命名 ...

  10. WPF中使用cefsharp

    原文:WPF中使用cefsharp 新入职一家公司,由写服务端接口变成了软硬件通信.服务器.客户端.C/S.B/S乱七八糟各种打杂.首先接收一个WPF项目,因为不熟WPF,再加上前端我也不熟,我打算使 ...