前面文章讲到怎么提取动态网页的全部内容。接下来返回文章一,怎么登录并且保存登录状态,以便带上cookies下次访问。

步骤

  1. 利用selenium登录知乎, 登录成功后保存cookies 到本地。
  2. 请求之前读取cookies, 加载cookies访问,看是否成功登录。

详细步骤:

  1. 利用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文件以后后续处理。接着对每一个问题下的所有图片链接提取,保存或者直接下载就看个人选择了。

  1. 提取该收藏夹下的全部链接保存到为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爬虫飙车找福利(三)相关推荐

  1. java短信验证码 60秒_Rxjava操作符飙车系列(三)验证码倒计时

    现在很多软件都需要获取短信验证码,通常都是60秒在向服务器发送一次请求.那么如果用Rxjava来实现这个倒计时的功能呢? 用到的操作符如下: 1.interval: interval 创建一个按照给定 ...

  2. 【Python实战】用Scrapyd把Scrapy爬虫一步一步部署到腾讯云上,有彩蛋

    接着之前的几篇文章说. 我把爬虫已经写好了,而且在本地可以运行了. 这个不是最终的目的啊. 我们是要在服务器上运行爬虫. 利用周末,同时腾讯送的7天云服务器体验也快到期了 就在这里再来一篇手把手的将爬 ...

  3. OSChina 周四乱弹 ——印象开源中国:总是飙车就容易脱发

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @达尔文 :被安利这首歌的时候,以为是首神曲,搜"赶鸡遇到你& ...

  4. Python网络爬虫之requests库Scrapy爬虫比较

    requests库Scrapy爬虫比较 相同点: 都可以进行页面请求和爬取,Python爬虫的两个重要技术路线 两者可用性都好,文档丰富,入门简单. 两者都没有处理JS,提交表单,应对验证码等功能(可 ...

  5. Scrapy爬虫及案例剖析

    来自:ytao 由于互联网的极速发展,所有现在的信息处于大量堆积的状态,我们既要向外界获取大量数据,又要在大量数据中过滤无用的数据.针对我们有益的数据需要我们进行指定抓取,从而出现了现在的爬虫技术,通 ...

  6. 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)

    试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...

  7. 【数据分析】干货!一文教会你 Scrapy 爬虫框架的基本使用

    出品:Python数据之道 (ID:PyDataLab) 作者:叶庭云 编辑:Lemon 一.scrapy 爬虫框架介绍 在编写爬虫的时候,如果我们使用 requests.aiohttp 等库,需要从 ...

  8. scrapy爬虫实战分享

    自动登录脚本参考 scrapy爬虫启示录-小伙子老夫看你血气方刚这本<爬虫秘录>就传给你了 Scrapy初章-Scrapy理论简介 Scrapy次章-啥也不干就是爬图 Scrapy第四章- ...

  9. scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)

    前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...

最新文章

  1. python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况
  2. 深入理解TCP实现|经典PDF分享
  3. 使用OpenCV-python提取图片中的硬币
  4. kubectl查看kubernetes运行信息
  5. 计算机专业教研成绩,2018学年第一学期计算机组教研组工作计划
  6. Oracle的latch机制源代码解析——借postgresql猜测Oracle的latch
  7. python 正态化_#Python数据分析/笔记 - 准备工作
  8. android之数组排序
  9. swift moya框架+rxswift+handyjson+SwiftyJSON封装和使用教程
  10. NS方程求解-PointNet和升维思想(效果很差)
  11. java hexbin_bin文件转换为hex文件操作步骤解析 - 全文
  12. iOS plist存储
  13. flv转换mp4最简单方法
  14. 个人推荐一款并发测试工具
  15. iOS开发之Tom猫
  16. 来我家玩吧服务器维护中,为什么来我家玩吧登录不了,来我家玩吧进不去怎么回事...
  17. 【知识图谱】语义网络,语义网,链接数据和知识图谱
  18. 我对INFOR WMS实施的一些感想
  19. 配置sumlime html,Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查
  20. 问题:npm如何设置仓库地址?

热门文章

  1. 又一个“戴森”崛起,网红小家电品牌凭什么俘获消费者的心?
  2. 300年保险即将被颠覆!MediShares ICO将启动全球首个智能合约市场
  3. 测评宝塔编译安装LNMP与LNMP一键安装包速度比较
  4. MVP社区巡讲照片集
  5. 解决大屏手机上setImageResource()内存溢出
  6. wiki admin.php,天兴工作室wiki主题 兼容会员系统可设置收费 适合知识付费类网站...
  7. ROS学习第七天 机器人系统设计(一)——(仿真导航)
  8. 赛马网基本算法之--日期倒计时
  9. 关于介绍手机k歌娱乐软件
  10. 【Python3爬虫】我爬取了七万条弹幕,看看RNG和SKT打得怎么样