快上车,scrapy爬虫飙车找福利(三)
前面文章讲到怎么提取动态网页的全部内容。接下来返回文章一,怎么登录并且保存登录状态,以便带上cookies下次访问。
步骤
- 利用selenium登录知乎, 登录成功后保存cookies 到本地。
- 请求之前读取cookies, 加载cookies访问,看是否成功登录。
详细步骤:
- 利用selenium登录知乎 回到文章一, 从自从有了知乎,再也不用找福利了……链接开始。 从提取标题开始:
if __name__ == '__main__':url = 'https://www.zhihu.com/collection/146079773'res = requests.get(url, verify=False)resSoup = BeautifulSoup(res.content, 'lxml')items = resSoup.select("div > h2 > a")print(len(items))
复制代码
verify=False
:取消ssl的验证。 运行这段代码, 输出结果未0, 粘贴该网页到一个没有登录知乎的浏览器打开,重定向到登录页, 说明需要登录。
验证:
if __name__ == '__main__':url = 'https://www.zhihu.com/collection/146079773'# res = requests.get(url, verify=False)driver = webdriver.Chrome()driver.get(url)driver.implicitly_wait(2)res = driver.page_sourceresSoup = BeautifulSoup(res, 'lxml')items = resSoup.select("div > h2 > a")print(len(items))
复制代码
执行代码,打开浏览器,显示知乎登录页,说明访问收藏夹需要登录。
登录技巧: 使用selenium打开登录页,设定延时时间(比如60s),手动输入账号密码登录知乎,60秒之后保存cookies到本地,完成登录。后续请求携带保存的cookie进行的登录。如果cookies过期,则简单重复这一步骤。 下面是详细步骤:
if __name__ == '__main__':ssl._create_default_https_context = ssl._create_unverified_context# url = 'https://www.zhihu.com/collection/146079773'url = "https://www.zhihu.com/signin"# res = requests.get(url, verify=False)driver = webdriver.Chrome()driver.implicitly_wait(5)driver.get(url)time.sleep(40)cookies = driver.get_cookies()pickle.dump(cookies, open("cookies.pkl", "wb"))print("save suc")
复制代码
执行这段代码,看是否有cookies.pkl文件生成, 成功保存了cookies。
接下来用第二段代码去验证。
if __name__ == '__main__':cookies = pickle.load(open("cookies.pkl", "rb"))url = 'https://www.zhihu.com/collection/146079773'driver = webdriver.Chrome()driver.get("https://www.zhihu.com/signin")for cookie in cookies:print(cookie)driver.add_cookie(cookie)driver.get(url)driver.implicitly_wait(2)res = driver.page_sourceresSoup = BeautifulSoup(res, 'lxml')items = resSoup.select("div > h2 > a")print(len(items))
复制代码
打开浏览器, 加载任意网页,接着加载cookies, 打开给定的url。运行代码,
如上,看到打印的cookies和提取的10个标题, 打开浏览器,页面不是登录页,说明登录成功。看cookies的有效时间。即可知道下次cookies的替换时间。
至此,最难定义的动态网页和登录问题已经解决。 下面就是怎么保存抓到的数据。 我的想法是先将需要登录的10页中所有问题和问题链接提取出来,保存为json文件以后后续处理。接着对每一个问题下的所有图片链接提取,保存或者直接下载就看个人选择了。
- 提取该收藏夹下的全部链接保存到为json文件或者txt文件。 回到爬虫,现在我们已经有了cookies,可以不用selenium很快的保存问题列表。 将上一步保存的cookies.pkl复制一份到根目录,或者配置打开属性。 首先取消
settings.py
文件中的中间键,
DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,# 'zhihu.middlewares.PhantomJSMiddleware': 100,
}
复制代码
反爬虫策略: 对于访问过快,网页一般会静止访问或者直接封ip。因此对于需要登录的爬虫来说,限制访问速度,比如5秒/次, 或者每个ip每分钟最大访问次数。对于不需要登录的页面来说,使用代理ip是最好的选择,或者降低访问次数都是可行的办法。 settings.py
文件的设置,
# Configure maximum concurrent requests performed by Scrapy (default: 16)
# CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 2
# The download delay setting will honor only one of:
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
# CONCURRENT_REQUESTS_PER_IP = 16
复制代码
这几个选项都是控制访问速度的,一般我设置DOWNLOAD_DELAY
即可,即每两秒访问一次。
执行代码如下:
class Zhihu(scrapy.Spider):name = "zhihu"cookeis = pickle.load(open("cookies.pkl", "rb"))urls = []questions_url = set()for i in range(1, 11):temp_url = "https://www.zhihu.com/collection/146079773?page=" + str(i)urls.append(temp_url)def start_requests(self):for url in self.urls:request = scrapy.Request(url=url, callback=self.parse, cookies=self.cookeis)yield requestdef parse(self, response):print(response.url)resSoup = BeautifulSoup(response.body, 'lxml')items = resSoup.select("div > h2 > a")print(len(items))for item in items:print(item['href'])self.questions_url.add(item['href'] + "\n")@classmethod# 信号的使用def from_crawler(cls, crawler, *args, **kwargs):print("from_crawler")# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_closed)return sdef spider_opened(self, spider):print("spider close, save urls")with open("urls.txt", "w") as f:for url in self.questions_url:f.write(url)
复制代码
命令行运行爬虫,查看url.txt
文件。
可以看到,成功抓取了44个链接,去除people, zhuanlan等几个无效链接, 后面即可从该文件读取内容,拼接链接,利用selenium做中间键提取所有的图片链接。
总结:这本文章讲了如何利用selenium去手动登录网站,保存cookies,以后后续登录(几乎可以登录所有的网站,限制访问速度避免被封)。
这三篇文章讲解了怎么使用scrapy去抓取想要的东西。现在无需使用框架,也可以涉及实现自己的爬虫。对于怎么保存图片,使用代理,后面会做简单介绍。 后面会写一篇怎么将爬虫部署在服务器上,利用docker搭建python环境去执行爬虫。
weixin:youquwen1226
github
欢迎来信探讨。
快上车,scrapy爬虫飙车找福利(三)相关推荐
- java短信验证码 60秒_Rxjava操作符飙车系列(三)验证码倒计时
现在很多软件都需要获取短信验证码,通常都是60秒在向服务器发送一次请求.那么如果用Rxjava来实现这个倒计时的功能呢? 用到的操作符如下: 1.interval: interval 创建一个按照给定 ...
- 【Python实战】用Scrapyd把Scrapy爬虫一步一步部署到腾讯云上,有彩蛋
接着之前的几篇文章说. 我把爬虫已经写好了,而且在本地可以运行了. 这个不是最终的目的啊. 我们是要在服务器上运行爬虫. 利用周末,同时腾讯送的7天云服务器体验也快到期了 就在这里再来一篇手把手的将爬 ...
- OSChina 周四乱弹 ——印象开源中国:总是飙车就容易脱发
2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @达尔文 :被安利这首歌的时候,以为是首神曲,搜"赶鸡遇到你& ...
- Python网络爬虫之requests库Scrapy爬虫比较
requests库Scrapy爬虫比较 相同点: 都可以进行页面请求和爬取,Python爬虫的两个重要技术路线 两者可用性都好,文档丰富,入门简单. 两者都没有处理JS,提交表单,应对验证码等功能(可 ...
- Scrapy爬虫及案例剖析
来自:ytao 由于互联网的极速发展,所有现在的信息处于大量堆积的状态,我们既要向外界获取大量数据,又要在大量数据中过滤无用的数据.针对我们有益的数据需要我们进行指定抓取,从而出现了现在的爬虫技术,通 ...
- 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)
试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...
- 【数据分析】干货!一文教会你 Scrapy 爬虫框架的基本使用
出品:Python数据之道 (ID:PyDataLab) 作者:叶庭云 编辑:Lemon 一.scrapy 爬虫框架介绍 在编写爬虫的时候,如果我们使用 requests.aiohttp 等库,需要从 ...
- scrapy爬虫实战分享
自动登录脚本参考 scrapy爬虫启示录-小伙子老夫看你血气方刚这本<爬虫秘录>就传给你了 Scrapy初章-Scrapy理论简介 Scrapy次章-啥也不干就是爬图 Scrapy第四章- ...
- scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)
前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...
最新文章
- python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况
- 深入理解TCP实现|经典PDF分享
- 使用OpenCV-python提取图片中的硬币
- kubectl查看kubernetes运行信息
- 计算机专业教研成绩,2018学年第一学期计算机组教研组工作计划
- Oracle的latch机制源代码解析——借postgresql猜测Oracle的latch
- python 正态化_#Python数据分析/笔记 - 准备工作
- android之数组排序
- swift moya框架+rxswift+handyjson+SwiftyJSON封装和使用教程
- NS方程求解-PointNet和升维思想(效果很差)
- java hexbin_bin文件转换为hex文件操作步骤解析 - 全文
- iOS plist存储
- flv转换mp4最简单方法
- 个人推荐一款并发测试工具
- iOS开发之Tom猫
- 来我家玩吧服务器维护中,为什么来我家玩吧登录不了,来我家玩吧进不去怎么回事...
- 【知识图谱】语义网络,语义网,链接数据和知识图谱
- 我对INFOR WMS实施的一些感想
- 配置sumlime html,Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查
- 问题:npm如何设置仓库地址?
热门文章
- 又一个“戴森”崛起,网红小家电品牌凭什么俘获消费者的心?
- 300年保险即将被颠覆!MediShares ICO将启动全球首个智能合约市场
- 测评宝塔编译安装LNMP与LNMP一键安装包速度比较
- MVP社区巡讲照片集
- 解决大屏手机上setImageResource()内存溢出
- wiki admin.php,天兴工作室wiki主题 兼容会员系统可设置收费 适合知识付费类网站...
- ROS学习第七天 机器人系统设计(一)——(仿真导航)
- 赛马网基本算法之--日期倒计时
- 关于介绍手机k歌娱乐软件
- 【Python3爬虫】我爬取了七万条弹幕,看看RNG和SKT打得怎么样