爬虫来啦!Day91
# 一.爬虫
# 1.基本操作
# 排名爬虫刷票
# 抽屉网的所有发布新闻点赞
# 自动化程序模拟用于的日常操作
# 投票的机制是利用cookies,禁用cookies模式
# 自定义的异步IO模块就是Socket的客户端
# 基本操作:使用python登陆任何的网站,图片识别验证码比较困难,需要额外的图片识别或特殊api(伪造浏览器的任何行为)
# 2.性能相关的操作
# 用最短的时间:多线程多进程解决大并发操作
# 5个线程并发,共同等待有损耗,把5个线程等待时进行其他程序
# 并发方案:用异步IO,之前的并发采用5个线程,现采用一个线程 gevent/Twisted/asyncio/aiohttp傻瓜式封装调用方法
# 会用方法表现异步IO
# IO多路复用 Select
# 3.做一个属于自己的爬虫框架,以高性能的方式爬取网站
# 打包开源放在github上,知名的爬虫框架:Scrapy:封装了所有的爬虫常用的方法,具有异步IO的并发功能(Twisted)
# 给予Scrapy源码定义自定义框架
# 使用Scrapy框架
# 二.Tornado 异步非阻塞特性框架
# 1.Tornado的基本使用,分析源码功能,可以快速基于Tornado的单表的增删改查。小示例感受
# 2.Toanado的源码剖析
# 3.异步非阻塞的就是Soctek的服务端
###################################################################################################################
#爬虫的基本知识
# 什么是爬虫?
# 互联网最开始根本没有百度、Google、Bing等,如果想要访问网站只能记住域名,很久之前是大黄页,一本书包含了各自域名的地址
# 想要访问网站就必须用文档记录找到文档检查,这样是十分麻烦的,文档内容多会很麻烦,于是诞生了搜索引擎,
# 通过自动程序抓取网站。做搜索引擎的来做大黄页,通过客户需求找到,客户提交信息至搜索引擎,收集信息给提供客户
# 百度通过机器人抓取关键字,提取信息。
# 网络信息都是息息相关的,友情链接到别的网站,机器人爬取网站所有的<a>标签,肯定有超链接,实际就是一个关系网的互相联系
# 把爬虫放在一个网站,自动化程序任意查找,具有定向和非定向
# 定向:只爬取某一个或某几个指定网站
# 非定向:爬取很多内容
# 公众号通过找网络上的合适资源爬取信息
# 租房信息的爬取
# 请求:http请求本质是一个字符串,包裹在整个的HTML的页面里的所有的标签内的信息,找到想要的标签信息(写组合正则表达式),
# python不用重复的写正则表达式,有开源的模块(类库)帮助实现
# 1.request模块访问网站
# pip3 install requests
# request.get('http:www.baidu.com')
# response.text
# 2.beautisoup模块
# pip3 install Beautisoup4
# from bs4 import Beautisoup
# soup = Beautisoup(response.text)这个HTML被转换为对象,对象可以嵌套对象,HTML的父子关系(对象嵌套)
# target = soup.find(id = 'auto-channel-lazyload-article')标签嵌套对象,找对象
# print (target)
###########################################################################################################
# 小结:
# 需求一:
# response = request.get('url')
# response.text
# response.content
# response.encoding
# response.aparent_encoding
# response.status_code
# soup = beautifulsoup('HTML')
# soup.find('div)
# soup = find(id='i1')
# v1 = soup = find('div, id = 'i1')两个参数可以作为组合条件
# v2 = soup = find_all('div, id = 'i1')参数与find相同,返回的内容是列表了
# v1是对象,v2是列表
# v1.text直接拿到文本 v2[0].text
# 需求二:
# 通过脚本程序自动登陆GitHup[其他网站]
# requests,访问网站需要输入用户名和密码,页面刷新使用form表单,没刷新使用AJAX提交
# post_dict = {
# "phone":'111111',
# "password": 'xxx',
# 'oneMonth':1
# }
# response = request.post(
# url = 'https://dig.chouti.com/login',
# data = post_dict
# )
#print(response.text)
# cookie_dict = response.cookies.get_dict()
###########################################################################################################
# 1.基本的模块的使用
# 2.模拟登陆
# 3.各个网站的套路不同
###########################################################################################################
# 三、模块的详细使用
# requests
# -方法关系:
# rquests.get(..)
# rquests.post(..)
# rquests.put(..)
# rquests.delete(..)
######以上都是request方法
# ——参数
# rquests.rquest:
# -method:提交方式
# -url:提交地址
# -params:在url上传递的参数放入GET,如果访问的是www.baidu.com,如果params = {'k1':'v1'}
# requests.request(
# method = 'GET',
# url = 'www.baidu.com',
# params = {'k1':'v1','k2':'v2'}
# )
# 提交后运行的结果为:http://www.baidu.com?k1=v1&k2=v2
# -data:在请求体里传递的数据,可以是字典、字节或文件对象
# requests.request(
# method = 'POST',
# url = 'www.baidu.com',
# params = {'k1':'v1','k2':'v2'},
# data = {'use':'xxx','pwd':'123'},或者data = 'user=xxx&pwd=123123'
# )
# -json:在请求体里传递数据,会把参数json.dump变成整体的字符串传递(字典中嵌套字典时使用)
# requests.request(
# method = 'GET',
# url = 'www.baidu.com',
# json = {'use':'xxx','pwd':'123'},>>>>请求头:content-typ:application/json;请求体:"{'use':'xxx','pwd':'123'}"
# )
# ######Django会根据发送的请求头的内容判断是否需要将请求体的内容进行POST的json转换
# - headers:请求头,爬取各种网站需要附加请求头
# 手写一个上一次访问的网站 headers = {
# Referer:'http;//www.baidu.com'
# 'User-Agent'>>可以伪造任何浏览器形式,来自什么设备
# }
# 网址参考:http://www.cnblogs.com/wupeiqi/articles/6283017.html
# -cookies:Cookies
# cookies是放在请求头里的
###########################################################################################################
# -files:上传文件'name':文件名(文件对象)
# requests.post(
# url='xxx',
# files = {
# 'f1':open('s1.py','rb'),
# 'f1':('上传至服务器端的文件名',open('s1.py','rb))
# }
# )
######
# -auth:认证,加密放在请求头里
# -timeout:超时,两个时间>>1.发送的时间;2.等待的时间
# -allow_redirects 是否允许重定向
# -proxies:代理,开发投票的网站只能使用同一个ip,不介入代理的话是不能修改的
# ret = requests.post(
# url='https://dig.chouti.com/link/vote?linksId=20162281',#某一个新闻的点赞url
# cookies = {'gpsd':'601f5ba78f2a5fdb1d374817117eca80'},#得到的gpsd
# #HTTPS记得加请求头呦
# headers = {'User-Agent':
# 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
# ' Chrome/66.0.3359.181 Safari/537.36'},
# proxys = {
# 'http':'http://4.19.128.5:8099'代理服务器,代理方发送
# }
# )
######
# -stream:流式传输(一点一点下载文件)循环式下载 for i in r.iter_content()
# -verify:
# -cert:
import requests
from bs4 import BeautifulSoup
response = requests.get(url='https://www.autohome.com.cn/news/')
# response.encoding = 'gbk'
# 下载的过程中是字节,必须用它的方式发来后再反解
# 用原网页的编码方式反解:response.encoding = response.apparent_enconding
response.encoding = response.apparent_encoding #等于response.encoding = 'gbk'
# print(response.text)
soup = BeautifulSoup(response.text, features='html.parser')
#将文本转换为对象,features表示以什么内置的处理方式转换:1.lxml;2.html.parser
# lxml性能更好
target = soup.find(id = 'auto-channel-lazyload-article')
# print(target)
# 继续缩小范围去找
li_list = target.find_all('li')
# find_all找到的是一个列表的汇总,本身已经没有soup对象的方法了,需要再用方法需要用list_all[0]拿到列表的某一个值
# print(li_list)
for i in li_list:
a = i.find('a')
if a:
print('http:'+a.attrs.get('href'))#attrs表示找到对象的所有的属性,href就是标签的属性
txt = a.find('h3') #拿到的h3是什么类型?print显示的是字符串,实际是对象,打印显示的是对象,需要加文本信息
print(txt.text)
img_url = 'http:'+a.find('img').attrs.get('src')#小练习:拿到a标签下的img标签的src属性
print(img_url)
img_response = requests.get(url=img_url)
import uuid
file_name = str(uuid.uuid4()) + '.jpg'
with open(file_name,'wb') as f:
f.write(img_response.content)#content意思是以字节的形式保存文件
import requests
# from bs4 import BeautifulSoup
# url = "https://huan.moe/"
# response = requests.get(url)
# response.encoding = response.apparent_encoding
# # print(response.text)
# soup = BeautifulSoup(response.text, features='html.parser')
# target = soup.find(attrs={'class','g-desktop-1-4 g-tablet-1-2 g-phone-1-2 archive-general card general type-post status-publish format-standard hentry'})
# print(target)
post_dict = {
"phone":'*******',
"password": '******',
'oneMonth':1
}
response = requests.post(
url = 'https://dig.chouti.com/login',
data = post_dict,
) print(response.text)
cookie_dict = response.cookies.get_dict()
print(cookie_dict)
res = requests.get(
url='https://dig.chouti.com/profile',
)
print(res.text)
import requests
#抽屉网gpsd验证点赞法
ret = requests.post(
url='https://dig.chouti.com/link/vote?linksId=20162281',#某一个新闻的点赞url
cookies = {'gpsd':'601f5ba78f2a5fdb1d374817117eca80'},#得到的gpsd
#HTTPS记得加请求头呦 )
print(ret.text)
抽屉网点赞方法
import requests
r1 = requests.get('https://dig.chouti.com/',
)
r1_cookies = r1.cookies.get_dict()
print(r1_cookies) post_dict = {
"phone":'llllllll',
"password": 'llllllll',
'oneMonth':1
}
r2 = requests.post(
url = 'https://dig.chouti.com/login',
data = post_dict, cookies = r1_cookies,
)
print(r2.text)
# r2_cookies = r2.cookies.get_dict()
# print(r2_cookies)
# r2_cookies = r2.cookies.get_dict()
# print(r2.text)
# cookie_dict = r2.cookies.get_dict()
# print(cookie_dict)
# res = requests.get(
# url='https://dig.chouti.com/profile',
#
#
# )
# print(res.text)
r3 = requests.post(
# url='https://dig.chouti.com/profile',
url='https://dig.chouti.com/link/vote?linksId=20160191', cookies = {'gpsd':r1_cookies.get('gpsd')}
)
print(r1_cookies.get('gpsd'))
print(r3.text)
抽屉网组合拳(有点小心机)
爬虫来啦!Day91的更多相关文章
- 设计爬虫Hawk背后的故事
本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- scrapy 知乎用户信息爬虫
zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- Python爬虫小白入门(四)PhatomJS+Selenium第一篇
一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...
- Python多线程爬虫爬取电影天堂资源
最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...
- QQ空间动态爬虫
作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...
随机推荐
- 转:Hibernate使用SQLQuery
原文:http://hi.baidu.com/luo_qing_long/blog/item/783a15eceb75abdd2f2e21b0.html 对原生SQL查询执行的控制是通过SQLQuer ...
- mysql中redo和binlog的区别
影响MySQL中redo的配置参数: innodb_log_file_size:指定每个redo日志大小,默认值48MB innodb_log_files_in_group:指定日志文件组中redo日 ...
- HDU 5912 Fraction
题目来源:2016 CCPC 长春站 题意:青蛙先生想计算一个式子的值,输入两个数列a[],b[]求出最后的分子和分母 思路:一开始看到这个图片首先想到的是递归实现,递归部分始终计算的是右下部分 /* ...
- 【NOI2001】食物链
[NOI2001]食物链 题意 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B ...
- MBR和GPT分区学习
1.MBR 早期的windows和linux都采用的MBR的方法来处理开机引导程序和分区表,对于linux的MBR分区来讲,0柱面0磁道1扇区用于引导驱动程序,第一扇区有512个字节,前446字节存放 ...
- Linux学习01
Linux学习第一天 1.使用VM安装RHEL7.0 具体参见刘遄老师的<Linux就该怎么学>https://www.linuxprobe.com/chapter-01.html 2.R ...
- [转载] C 陷阱与缺陷( C traps and Pitfalls )
本文转自 https://www.xuebuyuan.com/1951579.html 自己找工作过程中复习过的书包括<C traps and Pitfalls>,<编程珠玑> ...
- elementUI 日期时间选择器el-date-picker开始时间与结束时间约束
主要思路:el-date-picker组件需要 :picker-options属性,属性值为data,data的数据来自于methods中的方法. ##template代码 <el-form-i ...
- ./configure --prefix /?/? 解释
-- ./configure :编译源码 --prefix :把所有资源文件放在 之后的路径之后
- 2015 Multi-University Training Contest 4 hdu 5334 Virtual Participation
Virtual Participation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...