网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
python抓取中文
Python爬虫入门,快速抓取大规模数据(完结篇) 企业视频课程
前面的几篇文章讲解了爬虫的基本原理,并使用了一些代码来做演示。这是爬虫系列的最后一篇,这篇文章会对前面的内容总结一下,没有新的内容。
Python基本环境的搭建,爬虫的基本原理以及爬虫的原型Python爬虫入门,快速抓取大规模数据
如何使用BeautifulSoup对网页内容进行提取Python爬虫入门,快速抓取大规模数据(第二部分)
爬虫运行时数据的存储数据,以SQLite和MySQL作为示例Python爬虫入门,快速抓取大规模数据(第三部分)
使用selenium webdriver对动态网页进行抓取Python爬虫入门,快速抓取大规模数据(第四部分)
讨论了如何处理网站的反爬虫策略Python爬虫入门,快速抓取大规模数据(第五部分)
对Python的Scrapy爬虫框架做了介绍,并简单的演示了如何在Scrapy下进行开发Python爬虫入门,快速抓取大规模数据(第六部分)
限于篇幅的长度和作为爬虫入门文章,前面每一篇文章都只是对相关的内容作了一个简单的介绍。如果深入下去,每一部分都会有很多的内容,后面有机会在单独讨论。当然,如果对爬虫感兴趣和有工作的需要,可以用这些文章作为入门教程。
如何抓取这些网站数据?python源码大全,包括微信,知乎。QQ,豆瓣,天猫京东等 推广视频课程
WechatSogou[1]- 微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。[1]: https://github/Chyroc/WechatSogou
DouBanSpider[2]- 豆瓣读书爬虫。可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍;可依据不同的主题存储到Excel不同的Sheet ,采用User Agent伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。[2]: https://github/lanbing510/DouBanSpider
zhihu_spider[3]- 知乎爬虫。此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongodb。[3]: https://github/LiuRoy/zhihu_spider
bilibili-user[4]- Bilibili用户爬虫。总数据数:20119918,抓取字段:用户id,昵称,性别,头像,等级,经验值,粉丝数,生日,地址,注册时间,签名,等级与经验值等。抓取之后生成B站用户数据报告。[4]: https://github/airingursb/bilibili-user
SinaSpider[5]- 新浪微博爬虫。主要爬取新浪微博用户的个人信息、微博信息、粉丝和关注。代码获取新浪微博Cookie进行登录,可通过多账号登录来防止新浪的反扒。主要使用 scrapy 爬虫框架。[5]: https://github/LiuXingMing/SinaSpider
distribute_crawler[6]- 小说下载分布式爬虫。使用scrapy,redis, mongodb,graphite实现的一个分布式网络爬虫,底层存储mongodb集群,分布式使用redis实现,爬虫状态显示使用graphite实现,主要针对一个小说站点。[6]: https://github/gnemoug/distribute_crawler
CnkiSpider[7]- 中国知网爬虫。设置检索条件后,执行src/CnkiSpider.py抓取数据,抓取数据存储在/data目录下,每个数据文件的第一行为字段名称。[7]: https://github/yanzhou/CnkiSpider
LianJiaSpider[8]- 链家网爬虫。爬取北京地区链家历年二手房成交记录。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。[8]: https://github/lanbing510/LianJiaSpider
scrapy_jingdong[9]- 京东爬虫。基于scrapy的京东网站爬虫,保存格式为csv。[9]: https://github/taizilongxu/scrapy_jingdong
QQ-Groups-Spider[10]- QQ 群爬虫。批量抓取 QQ 群信息,包括群名称、群号、群人数、群主、群简介等内容,最终生成 XLS(X) / CSV 结果文件。[10]: https://github/caspartse/QQ-Groups-Spider
wooyun_public[11]-乌云爬虫。 乌云公开漏洞、知识库爬虫和搜索。全部公开漏洞的列表和每个漏洞的文本内容存在mongodb中,大概约2G内容;如果整站爬全部文本和图片作为离线查询,大概需要10G空间、2小时(10M电信带宽);爬取全部知识库,总共约500M空间。漏洞搜索使用了Flask作为web server,bootstrap作为前端。[11]: https://github/hanc00l/wooyun_public
QunarSpider[12]- 去哪儿网爬虫。 网络爬虫之Selenium使用代理登陆:爬取去哪儿网站,使用selenium模拟浏览器登陆,获取翻页操作。代理可以存入一个文件,程序读取并使用。支持多进程抓取。[12]: https://github/lining0806/QunarSpider
findtrip[13]- 机票爬虫(去哪儿和携程网)。Findtrip是一个基于Scrapy的机票爬虫,目前整合了国内两大机票网站(去哪儿 + 携程)。[13]: https://github/fankcoder/findtrip
163spider[14] - 基于requests、MySQLdb、torndb的网易客户端内容爬虫。[14]: https://github/leyle/163spider
doubanspiders[15]- 豆瓣电影、书籍、小组、相册、东西等爬虫集。[15]: https://github/dontcontactme/doubanspiders
QQSpider[16]- QQ空间爬虫,包括日志、说说、个人信息等,一天可抓取 400 万条数据。[16]:https://github/LiuXingMing/QQSpider
baidu-music-spider[17]- 百度mp3全站爬虫,使用redis支持断点续传。[17]: https://github/Shu-Ji/baidu-music-spider
tbcrawler[18]- 淘宝和天猫的爬虫,可以根据搜索关键词,物品id来抓去页面的信息,数据存储在mongodb。[18]: https://github/pakoo/tbcrawler
stockholm[19]- 一个股票数据(沪深)爬虫和选股策略测试框架。根据选定的日期范围抓取所有沪深两市股票的行情数据。支持使用表达式定义选股策略。支持多线程处理。保存数据到JSON文件、CSV文件。[19]https://github/benitoro/stockholm
Python数据抓取 —简单网络爬虫的撰写 互联网视频课程
@数据分析-jacky
@数据分析-jacky
全称:Document ObjectModel Tree,它是一组API,可以跟网页的元素进行互动,使用BeautifulSoup就可以把网页变成一个DOM TREE,我们就可以根据DOM TREE的节点进行操作
@数据分析-jacky
上图的举例,最外面结构是html,是最上层的节点,下面一层是body,里面包含h1和a两个链接,这些就组成了DOM TREE的架构,我们就可以根据这个架构下的某些节点进行互动,我们可以取得h1里面的词,也可以取得a里面的词,这时候我们就可以把数据顺利提取出来;
@数据分析-jacky
这里会显示警告信息,警告信息告诉我们这段代码没有使用到我们的剖析器,这时python会预测一个剖析器给我们,如果我们要避免这种警告的产生,我们可以在代码中指明
@数据分析-jacky
如何进一步把上面的文字解开?加上[0],可以去掉中括号,加.text可以把里面的文字取出来
print(header[0].text)
@数据分析-jacky
本文为中国统计网原创文章,需要转载请联系中国统计网(),转载时请注明作者及出处,并保留本文链接。
我用 Python 抓取了 7000 多本电子书 营销视频课程
头两天神游网上,无意间发现个可以免费下载电子书的网站,一下子就勾起了我的收藏癖,心痒痒的要把这些书下载下来,正好前不久 requests的作者 kennethreitz 出了一个新库 requests-html ,它不仅可以请求网页,还可以解析 HTML 文档,话不多说,咱开始吧。
安装
安装很简单,只要执行:
pip install requests-html
就可以了。
分析页面结构
通过浏览器审查元素可以发现这个电子书网站是用 WordPress 搭建的,首页列表元素很简单,很规整,
所以我们可以查找 .entry-title >a获取所有图书详情页的链接,接着我们进入详情页,来寻找下载链接,由下图
可以发现 .download-links > a里的链接就是该书的下载链接,回到列表页可以发现该站一共 700 多页,由此我们便可以循环列表获取所有的下载链接。
Requests-html 快速指南
发送一个 GET 请求:
from requests_html import HTMLSessionsession = HTMLSession()r = session.get('https://python.org/')
Requests-html 的方便之处就是它解析 html 方式就像使用 jQuery 一样简单,比如:
# 获取页面的所有链接可以这样写:r.html.links# 会返回 {'//docs.python.org/3/tutorial/', '/about/apps/'}# 获取页面的所有的绝对链接:r.html.absolute_links# 会返回 {'https://github/python/pythondotorg/issues', 'https://docs.python.org/3/tutorial/'}# 通过 CSS 选择器选择元素:about = r.find('.about', first=True)# 参数 first 表示只获取找到的第一元素about.text # 获取 .about 下的所有文本about.attrs # 获取 .about 下所有属性像 id, src, href 等等about.html # 获取 .about 的 HTMLabout.find('a') # 获取 .about 下的所有 a 标签
构建代码
from requests_html import HTMLSessionimport requestsimport timeimport jsonimport randomimport syssession = HTMLSession()list_url = 'http://allitebooks/page/'USER_AGENTS = ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1", "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"]# 获取当前列表页所有图书链接def get_list(url): response = session.get(url) all_link = response.html.find('.entry-title a') # 获取页面所有图书详情链接 for link in all_link: getBookUrl(link.attrs['href'])# 获取图书下载链接def getBookUrl(url): response = session.get(url) l = response.html.find('.download-links a', first=True) if l is not None: # 运行后发现有的个别页面没有下载链接,这里加个判断 link = l.attrs['href']; download(link)#下载图书def download(url): # 随机浏览器 User-Agent headers={ "User-Agent":random.choice(USER_AGENTS) } # 获取文件名 filename = url.split('/')[-1] # 如果 url 里包含 .pdf if ".pdf" in url: file = 'book/'+filename # 文件路径写死了,运行时当前目录必须有名 book 的文件夹 with open(file, 'wb') as f: print("正在下载 %s" % filename) response = requests.get(url, stream=True, headers=headers) # 获取文件大小 total_length = response.headers.get('content-length') # 如果文件大小不存在,则直接写入返回的文本 if total_length is None: f.write(response.content) else: # 下载进度条 dl = 0 total_length = int(total_length) # 文件大小 for data in response.iter_content(chunk_size=4096): # 每次响应获取 4096 字节 dl += len(data) f.write(data) done = int(50 * dl / total_length) sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) ) # 打印进度条 sys.stdout.flush() print(filename + '下载完成!')if __name__ == '__main__': #从这运行,应为知道列表总数,所以偷个懒直接开始循环 for x in range(1,756): print('当前页面: '+ str(x)) get_list(list_url+str(x))
运行效果:
Python爬虫:抓取手机APP的数据 行业视频课程
摘要
大多数APP里面返回的是json格式数据,或者一堆加密过的数据 。这里以超级课程表APP为例,抓取超级课程表里用户发的话题。
python爬虫抓取房产信息 企业视频课程
一、基本思路
1、使用python 的urllib2抓取网页信息下载下来
2、使用beatifulsoup4对网页信息进行分析,获得所需的字段信息
3、建立sqlite3轻型数据库用于保存网页信息
二、实施工艺
1、python使用urllib2抓取网页信息
# coding:utf-8import urllib2import timeMAX_TRIES=3class HtmlDownloader(object): def download(self, url): if url is None: return None useragent='Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36' #print url opener = urllib2.Request(url) opener.add_header('User-Agent', useragent) opener.add_header('Referer','http://baidu/') for tries in range(MAX_TRIES): try: response=urllib2.urlopen(opener) return response.read() except urllib2.URLError, e: if tries<(MAX_TRIES-1): time.sleep(2) continue else: print e.reason,url return None return None
2、创建sqlite3数据库操作公用类
import sqlite3, re, threadimport json, sys
MAX_NUM = int(2e4)
class Sqlite3Client: def __enter__(self): return self def __init__(self, sqlDir): self.sqlDir = sqlDir self._connection = sqlite3.connect(sqlDir) self._cursor = self._connection.cursor() self._storedDataSource = None def execute(self, sql, data = []): self._cursor.execute(sql, data) self._connectionmit() def query(self, sql, data = []): self._cursor.execute(sql, data) #print sql return self._cursor.fetchall() def insertbatchdata(self,tableName,rows): for items in rows: try: self._cursor.execute('insert into %s values(%s)'%(tableName, ', '.join(['?' for i in items])), items) except Exception,error: print error continue self._connectionmit() def insert_data(self, tableName, items = []): self._cursor.execute('insert into %s values(%s)'%(tableName, ', '.join(['?' for i in items])), items) self._connectionmit() # the following 4 functions don't use safe execute and may cause problems # please make sure the input is safe before use them def restruct_table(self, tableName, orderBy, restructedTableName = None): if restructedTableName is None: restructedTableName = 'restructed_' + tableName orderByString = ', '.join(['%s %s'%(key[0], key[1]) for key in orderBy]) self.query(self.query('show create table %s'%tableName)[0][1].replace(tableName, restructedTableName, 1)) sys.stdout.write('Restructuring the data storage...\r') totalNum = self.query('select count(*) from %s'%tableName)[0][0] s = self.data_source('select * from %s order by %s'%(tableName, orderByString)) count = 0 totalCount = 0 process = -1 for data in s: self.insert_data(restructedTableName, data) count += 1 totalCount += 1 if process < totalCount * 100 / totalNum: process = totalCount * 100 / totalNum sys.stdout.flush() sys.stdout.write('Restructuring the data storage: %s%s\r'%(process, '%')) if count >= MAX_NUM: count = 0 self._connectionmit() self._connectionmit() print 'Restructuring Finished' return restructedTableName def simple_data_source(self, sql): # return a function to provide one data at a time c = self._connection.cursor() c.execute(sql) for item in c.fetchall(): yield item def parallel_get_source_of_data_source(self, sql, beginNumber = 0): regex = repile('from (\S+)') tableName = re.findall(regex, sql)[0] totalNum = self.query('select count(*) from %s'%tableName)[0][0] unitNumber = totalNum / MAX_NUM + 1 self._storedDataSource = self.simple_data_source('%s limit %s, %s'%(sql, beginNumber, MAX_NUM)) def get(i): self._storedDataSource = self.simple_data_source('%s limit %s, %s'%(sql, i * MAX_NUM, MAX_NUM)) if unitNumber == beginNumber / MAX_NUM: yield self._storedDataSource for i in range(beginNumber / MAX_NUM + 1, unitNumber + 1): while self._storedDataSource is None: print 'Thread sucks' r = self._storedDataSource self._storedDataSource = None thread.start_new_thread(get, (i,)) yield r def data_source(self, sql): # limit is now useless here regex = repile('(select .*? from .*?)(?: limit (\S+),.*)?$') r = re.findall(regex, sql)[0] sourceOfDataSource = self.parallel_get_source_of_data_source(r[0], int(r[1]) if r[1] else 0) for dataSource in sourceOfDataSource: for data in dataSource: yield data def __exit__(self, *args): if self._cursor: self._cursor.close() if self._connection: self._connection.close()
if __name__ == '__main__': with Sqlite3Client('wcStorage.db') as s3c: s3c.insert_data('message', items = [str({'a':'a'}),'a:""','a','a']) r = s3c.data_source('select * from message') for item in r: print item
3、下载网页并分析保存有用的信息
# coding:utf-8import sysimport osimport html_downloaderfrom db.Sqlite3Client import Sqlite3Clientfrom bs4 import BeautifulSoupfrom multiprocessing.dummy import Pool as ThreadPoolfrom time import sleepreload(sys)sys.setdefaultencoding("utf-8")#抓取地址HOMEURL='https://xm.anjuke/sale/'CRAWURL='https://xm.anjuke/sale/p2/#filtersort'
class SpiderMain(object): def __init__(self): self.load_sql_storage('anjuke') self.s3c=Sqlite3Client(self.sqlDir) self.down=html_downloader.HtmlDownloader() self.nextpage=CRAWURL self.pool=ThreadPool() def load_sql_storage(self,dbname): self.sqlDir = os.path.join('./anjuke','%s.db'%dbname) with Sqlite3Client(self.sqlDir) as s3c: s3c.execute('create table if not exists houses (bianma text,faburiqi text,title text, xiaoqu text,xiaoqu_url, fangxing text,weizhi text,mianji numeric,danjia numeric,niandai text,chaoxiang text,zhongjie text,dianhua text,primary key(bianma))')
def down_titles(self,downurl,callback): try: htmldoc=self.down.download(downurl) if htmldoc is None: print 'Error' return None soup=BeautifulSoup(htmldoc,'html.parser',from_encoding='utf8') # hreflist=soup.find_all('a',class_='houseListTitle') urls=[] for hr in hreflist: urls.append(hr['href']) #print urls self.pool.map(callback,urls) #下一页 > nextpage=soup.find('a',class_="aNxt") return nextpage['href'] except Exception,error: print error def down_article(self,downurl): try: htmldoc=self.down.download(downurl) if htmldoc is None: print 'Error' return None soup=BeautifulSoup(htmldoc,'html.parser',from_encoding='utf8')
#房屋编码: 861183257,发布时间:2017年06月02日 house_encode=soup.find('span',class_='house-encode').text #print house_encode bianma=house_encode.split(',')[0].split(':')[1] faburiqi=house_encode.split(',')[1].split(':')[1] #
瑞鑫一期 厦门海沧龙池周边 环境优美
title=soup.find('h3',class_='long-title').text #第一列 first_col=soup.find('p',class_='first-col detail-col') xiaoqu=first_col.find_all('dd')[0].text xiaoqu_url=first_col.find_all('dd')[0].a['href'] weizhi=first_col.find_all('dd')[1].text niandai=first_col.find_all('dd')[2].text.split('年')[0] #第二列 second_col=soup.find('p',class_='second-col detail-col') fangxing=second_col.find_all('dd')[0].text mianji=second_col.find_all('dd')[1].text.split('平')[0] chaoxiang=second_col.find_all('dd')[2].text #第三列 third_col=soup.find('p',class_='third-col detail-col') danjia=third_col.find_all('dd')[1].text.split('元')[0] #曾彩根
zhongjie=soup.find('p',class_='brokercard-name').text #136 9501 6124
dianhua=soup.find('p',class_='broker-mobile').text #print bianma,faburiqi,title, xiaoqu,xiaoqu_url,fangxing,weizhi,mianji,danjia,niandai,chaoxiang,zhongjie,dianhua dbsave=Sqlite3Client(self.sqlDir) dbsave.insert_data('houses', [bianma,faburiqi,title, xiaoqu,xiaoqu_url, fangxing,weizhi,mianji,danjia,niandai,chaoxiang,zhongjie,dianhua]) print '成功保存:',title except Exception,error: print '错误:',errordef batchdowntitles(self): cnt=0 while(True): if self.nextpage is None: break self.nextpage=self.down_titles(self.nextpage,self.down_article) sleep(5) cnt+=1 print u'完成下载第'+str(cnt)+u'页'if __name__ == "__main__":
pyspider = SpiderMain() pyspider.batchdowntitles()
4、运行显示界面:
在eclipse的console下运行状态
5、用sqlite expert查看数据并导出
sqlite expert软件查看数据
全选数据可以导出成excel表
可以将数据导出excel表
也可以用sql语句查询
查询小区均价排行
用技术玩转房商
导师给的临时任务!叫我用Python把中国当官的人员都抓取到信息! 公司视频课程
一. 文本爬取(基于Python3.6):
在上面的代码中,我已经进行了详细注释,应该能大致看懂。下面重点解析几个容易出错的部分。
源码左上角那个小按钮用处很大,单击之后,鼠标点网页哪里,右边就显示哪里对应的代码。按理来说,接下来就可以仔细查看源码,然后根据规律编程了。
然而!!!偶然发现,选择按姓氏查询,和按籍贯查询看到的源码有所不同。
当选择按姓氏查询时,对应
我直接用下面这句代替新增的前三行:
三 分词与信息抽取
此处调用了哈工大研发的一个包:pyltp。关于此包的下载、配置和使用,可以参考官方文档,链接如下(是中文的哦):
http://pyltp.readthedocs.io/zh_CN/develop/api.html
pyltp可完成中文分句、分词、词性标注、命名实体识别、依存句法分析(主谓、动宾等。说实话,作为人,我都分不清这个)、语义角色标注(标注词语与谓词的关系)。
因此,用pyltp即可完成分词和命名实体识别(信息抽取)两个任务。
关于命名实体识别的简单定义如下:
2. WindowsError[2]
至今没弄懂这个错误出现的根本原因,不过根据测试大致猜到了。下面这行代码的路径一定要写全,不能用变量名代替。如,写s='D:/Data_Rabbit/jianli/'+d+'/'+d2+'/'+'0.txt' ,os.path.getsize(s)是不行的。要写成如下形式:
谢谢阅读!!!!
Python抓取app数据(摩拜单车) 企业视频课程
前几天有人问我,可以帮我抓取摩拜单车的数据嘛?
我想着帮他抓取下次他还是不会,古话说的好:授人以鱼不如授人以渔,所以本次我们就讲讲如何抓取app的内容吧。
Fiddle的安装及配置
抓手机包我用的是fiddle。
安装
先在下载页面下载-→https://telerik/download/fiddler
选择你“准备用fiddle来干嘛”
你的邮箱
以及同意“最终用户许可协议”就可以下载了
下载后按照提示安装就可以了。
配置
源码 群 5952 66089
开始抓包
首先确保电脑和手机连在同一个WiFi下面
打开fiddle
获取电脑ip
打开cmd命令行
输入ipconfig,如图所示,192.168.31.146就是我的ip地址
打开手机WiFi设置,找到你当前链接的WiFi
我当前链接的是Xiaomi_E172_5G
设置代理服务器为你电脑的ip,端口号为上面设置的端口号(默认为8888)
安装https证书
在手机浏览器上打开 你电脑ip:你设置的端口号
我的是192.168.31.146:8888
点击框框处安装证书
设置fiddle监听所有请求
选择all process
打开摩拜单车app
然后你会看到定位的时候一辆车也没有。。。
打开个人详情页还提示“抱歉,服务暂不可用。
这是因为摩拜有防抓取限制(我猜是检测,如果有使用代理的话,直接让你用不了。。。)
那这样的话我们就没办法抓到么???
因为我之前还用过摩拜的小程序,所以我们抓抓微信小程序试试看
打开摩拜单车的小程序
我们看到已经定位了。。,并且把附件的单车都显示出来了
我们可以多移动我们的位置,然后等有把附近的车显示出来
可以看到fiddle上面已经有好多请求了
mobike-api。。。这很明显就是我们要找的请求
请求头如下图所示,方法是post
返回值因为我看到是json的格式了,所以直接以json的格式看。
源码 群 59 5266089
可以看到我们已经抓取了需要的数据,那么怎么抓取整个上海的摩拜单车情况呢??
只要获取上海的所有经纬度,然后替换上面data中的经度及纬度就可以了。。。
那么怎么获取上海的所有经纬度。。。这方面没怎么接触。。
看完我相信大家应该多试几次就好了。比较实用的技巧奉上。
Python数据抓取 —简单网络爬虫的撰写 推广视频课程
@数据分析-jacky
@数据分析-jacky
全称:Document ObjectModel Tree,它是一组API,可以跟网页的元素进行互动,使用BeautifulSoup就可以把网页变成一个DOM TREE,我们就可以根据DOM TREE的节点进行操作
@数据分析-jacky
上图的举例,最外面结构是html,是最上层的节点,下面一层是body,里面包含h1和a两个链接,这些就组成了DOM TREE的架构,我们就可以根据这个架构下的某些节点进行互动,我们可以取得h1里面的词,也可以取得a里面的词,这时候我们就可以把数据顺利提取出来;
@数据分析-jacky
这里会显示警告信息,警告信息告诉我们这段代码没有使用到我们的剖析器,这时python会预测一个剖析器给我们,如果我们要避免这种警告的产生,我们可以在代码中指明
@数据分析-jacky
如何进一步把上面的文字解开?加上[0],可以去掉中括号,加.text可以把里面的文字取出来
print(header[0].text)
@数据分析-jacky
本文为中国统计网原创文章,需要转载请联系中国统计网(),转载时请注明作者及出处,并保留本文链接。
Python爬虫:抓取手机APP的数据 公司视频课程
摘要
大多数APP里面返回的是json格式数据,或者一堆加密过的数据 。这里以超级课程表APP为例,抓取超级课程表里用户发的话题。