之前网络上上多的教程,包括视频教程,都用了很老的方式,老师也说过爬虫和反爬是一场永不停息的战斗。我在这次体会的淋漓尽致,前一天知乎的登录刚刚告破,第二天知乎就改版了,现在知乎的登录方式是通过文件上传的方式,而且每个登录的验证码也是加密的js方式,我这才疏学浅搞不定恨啊。我因为这彻夜难眠搞了3天还是没搞定。平常还得上班,晚上回来都没搞定,最后在不断的深入学习过程中,我发现了一个很牛逼的方式也是直接攻破知乎登录的方式。
from scrapy.http import HtmlResponse import re class JSPageMiddleware(object): def process_request(self, request, spider): # if spider.name == 'jobbole': # spider.browser.get(request.url) # import time # time.sleep(3) # print("访问:{0}".format(request.url)) # # return HtmlResponse(url=spider.browser.current_url,body=spider.browser.page_source,encoding="utf-8",request=request) if spider.name == 'zhihu' and not re.match("(.*zhihu.com/question/(\d+))(/|$).*", request.url): spider.browser.get(request.url) import time time.sleep(3) if request.url =='https://www.zhihu.com/signin': spider.browser.find_element_by_css_selector(".Login-content input[name='username']").send_keys("13460688542") spider.browser.find_element_by_css_selector(".Login-content input[name='password']").send_keys("3989441qwe") spider.browser.find_element_by_css_selector(".Button.SignFlow-submitButton.Button--primary.Button--blue").click() time.sleep(3) print("访问:{0}".format(request.url)) return HtmlResponse(url=spider.browser.current_url,body=spider.browser.page_source,encoding="utf-8",request=request)
middlewares.py 中加入
DOWNLOADER_MIDDLEWARES = { # 'ArticleSpider.middlewares.RandomUserAgentMiddleware': 543, 'ArticleSpider.middlewares.JSPageMiddleware':1 }
MYSQL_HOST='' MYSQL_DBNAME='scrapy' MYSQL_USER='root' MYSQL_PASSWORD='123' MYSQL_CHARSET='utf8' MYSQL_USE_UNICODE=True
settings.py加入
import scrapy import json import time import os import re from scrapy.loader import ItemLoader from ..items import ZhihuAnswerItem,ZhihuQuestionItem from selenium import webdriver from scrapy.xlib.pydispatch import dispatcher from scrapy import signals try: import urlparse as parse except: from urllib import parse class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['www.zhihu.com'] # start_urls = ['https://www.zhihu.com/question/263432973'] start_urls = ['https://www.zhihu.com/signin'] xsrf = '' header = { "Host": "www.zhihu.com", "Referer": "https://www.zhihu.com/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Cache-Control": "max-age=0", "Connection": "keep-alive", "USER_AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36" } def __init__(self): self.browser = webdriver.Chrome(executable_path="D:/Program Files/selenium_brower/chromedriver.exe") super(ZhihuSpider, self).__init__() dispatcher.connect(self.spider_closed, signals.spider_closed) def spider_closed(self, spider): self.browser.quit() def parse(self, response): #yield scrapy.Request("https://www.zhihu.com/question/263432973",headers=self.header,callback=self.parse_question) all_urls = response.css("a::attr(href)").extract() all_urls = [parse.urljoin(response.url, url) for url in all_urls] all_urls = filter(lambda x: True if x.startswith("https") else False, all_urls) for url in all_urls: match_obj = re.match("(.*zhihu.com/question/(\d+))(/|$).*", url) if match_obj: # 如果提取到question相关的页面则下载后交由提取函数进行提取 request_url = match_obj.group(1) print(request_url) yield scrapy.Request(request_url, headers=self.header, callback=self.parse_question) else: print("没有符合的") # 如果不是question页面则直接进一步跟踪 yield scrapy.Request(url, headers=self.header, callback=self.parse) def parse_question(self,response): match_obj = re.match(".*www.zhihu.com/question/(\d.*)",response.url) if match_obj: zhihu_id = match_obj.group(1) item_loader = ItemLoader(item=ZhihuQuestionItem(), response=response) item_loader.add_css("title","h1.QuestionHeader-title::text") item_loader.add_css("content", ".QuestionHeader-detail") item_loader.add_value("url",response.url) item_loader.add_value("zhihu_id", zhihu_id) item_loader.add_css("answer_num", ".QuestionAnswers-answers span::text") item_loader.add_css("comments_num", ".QuestionHeader-Comment button::text") item_loader.add_css("watch_user_num",".QuestionFollowStatus .QuestionFollowStatus-counts div strong::text") item_loader.add_xpath("topics", "//*[@class='TopicLink']/div/div/text()") question_item = item_loader.load_item() yield question_item pass
zhihu.py
class ZhihuQuestionItem(scrapy.Item): zhihu_id = scrapy.Field() topics = scrapy.Field() url = scrapy.Field() title = scrapy.Field() content = scrapy.Field() creat_time = scrapy.Field() update_time = scrapy.Field() answer_num = scrapy.Field() comments_num = scrapy.Field() watch_user_num = scrapy.Field() click_num = scrapy.Field() def get_insert_sql(self): insert_sql = """ insert into zhihu_question (zhihu_id,topics,url,title,content,creat_time,update_time,answer_num,comments_num,watch_user_num,click_num,crawl_time,crawl_update_time) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE comments_num=VALUES(comments_num),watch_user_num=VALUES(watch_user_num),click_num=VALUES(click_num) """ zhihu_id = self["zhihu_id"][0] topics = ",".join(self["topics"]) url = "".join(self["url"]) title = "".join(self["title"]) content = "".join(self["content"]) creat_time = datetime.datetime.now().strftime(SQL_DATETIME_FORMAT) update_time = datetime.datetime.now().strftime(SQL_DATETIME_FORMAT) answer_num = self["answer_num"][0] comments_num = get_nums(self["comments_num"][0]) watch_user_num = self["watch_user_num"][0] click_num = self["watch_user_num"][1] crawl_time = datetime.datetime.now().strftime(SQL_DATETIME_FORMAT) crawl_update_time =datetime.datetime.now().strftime(SQL_DATETIME_FORMAT) params = (zhihu_id,topics,url,title,content,creat_time,update_time,answer_num,comments_num,watch_user_num,click_num,crawl_time,crawl_update_time) return insert_sql,params
items.py 加入
class MysqlTwistedZhihuPipline(object): #通过连接池的方式 def __init__(self,dbpool): self.dbpool = dbpool @classmethod def from_settings(cls, settings): dbparms = dict( host=settings["MYSQL_HOST"], db=settings["MYSQL_DBNAME"], user=settings["MYSQL_USER"], passwd=settings["MYSQL_PASSWORD"], charset=settings["MYSQL_CHARSET"], cursorclass=MySQLdb.cursors.DictCursor, use_unicode=settings["MYSQL_USE_UNICODE"], ) dbpool = adbapi.ConnectionPool("MySQLdb", **dbparms) return cls(dbpool) def process_item(self, item, spider): # 使用twisted将mysql插入变成异步执行 query = self.dbpool.runInteraction(self.do_insert, item) query.addErrback(self.handle_error, item, spider) # 处理异常 def handle_error(self, failure, item, spider): # 处理异步插入的异常 print(failure) def do_insert(self, cursor, item): insert_sql,params = item.get_insert_sql() cursor.execute(insert_sql, params)
pipelines.py中加入
数据库创建sql
相关推荐
【标题】"zhihu_scrapy_爬虫excel_知乎爬虫_scrapy扫码登录_" 描述了一种使用Python的Scrapy框架开发的知乎爬虫项目,该爬虫能够实现通过手机扫码的方式模拟登录知乎,然后抓取用户指定的知乎页面上的内容,如回答和...
**基于Scrapy的知乎爬虫** 在Python的网络爬虫领域,Scrapy是一个非常强大的框架,它提供了高效且结构化的数据抓取能力。本文将深入探讨如何利用Scrapy来构建一个针对知乎平台的爬虫,包括爬取用户信息、话题内容...
此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用?分析、图谱甚至是学习Scrapy框架作为一个很好的示例 ### 本地运行 爬虫程序依赖mongo和...
"知乎爬虫爬不了了"这个问题可能涉及到多个方面,包括但不限于网站结构变化、反爬策略、Python编程技巧以及网络请求的处理。以下是一些相关的知识点: 1. **网站结构与反爬策略**:知乎作为热门的知识分享平台,会...
- **登录与Cookie管理**:由于知乎部分内容需要登录后才能查看,爬虫可能需要处理登录状态,保存并发送Cookie。 - **动态加载内容**:知乎部分图片可能由JavaScript动态加载,需使用如Selenium这样的浏览器自动化...
因为最近自己想做点图像识别的东西,苦于没有资源,谢了一个爬取知乎美女图片的爬虫,因为量不是特别大,没有用scrapy来做,这个效果一样,时间稍长一点,大概2,3个小时吧,需要的可以拿走
- 最后,运行Scrapy爬虫,它会按照我们设定的规则自动登录知乎,抓取用户信息,并将其存入MongoDB。 在整个过程中,需要注意遵守网站的robots.txt规则,避免过于频繁的请求导致IP被封禁。此外,由于涉及到模拟登录...
【知乎爬虫】是互联网数据抓取领域的一个具体实践,主要目标是对知乎网站上的信息进行自动化采集。爬虫技术在数据分析、市场研究、竞争情报等多个领域都有广泛应用。在这个项目中,我们将探讨如何使用Python编程语言...
本示例中,我们关注的是"Python知乎爬虫代码",这是一个针对初学者的爬虫项目,旨在帮助他们理解如何使用Python进行网页数据抓取。 首先,我们要了解什么是网络爬虫。网络爬虫(Web Crawler)是程序或脚本,自动...
9. **Scrapy框架**:对于更复杂的项目,可以使用Scrapy,这是一个强大的Python爬虫框架,提供了完整的解决方案,包括中间件、调度器和下载器等。 10. **测试与调试**:通过编写测试用例来验证爬虫功能,使用断点、...
Scrapy爬取知乎用户信息实战 Scrapy+Cookies池抓取新浪微博 Scrapy+Tushare爬取微博股票数据 分布式篇 Scrapy分布式原理及Scrapy-Redis源码解析 Scrapy分布式架构搭建抓取知乎 Scrapy分布式的部署详解
1. **登录与cookie**:由于知乎部分内容需要登录才能查看,所以爬虫可能需要实现模拟登录功能,保存并发送cookie,以便访问受保护的页面。 2. **动态加载**:知乎部分页面使用了AJAX技术动态加载内容,爬虫可能需要...
"知乎爬虫"这个主题涉及到的是利用Python技术来抓取知乎网站上的数据。然而,"知乎爬虫爬不了了"表明可能遇到了一些挑战或限制,这可能是由于网站反爬策略、IP被封禁、验证码机制、更新的网页结构或者Python源码中的...
本文将深入探讨如何使用Scrapy框架结合Redis构建一个高效的知乎分布式爬虫系统,实现对知乎数据的快速抓取。 首先,Scrapy是Python的一个强大的爬虫框架,它提供了丰富的功能和组件,使得开发爬虫变得简单高效。...
模拟登录,用scrapy+selenium+PhantomJS爬取知乎话题的评论,并且做成关键字词云展示
基于Scrapy框架的知乎用户爬虫文档详细+资料齐全.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心...
5. 爬虫框架:Python有许多成熟的爬虫框架,如Scrapy,它可以与验证码识别模块相结合,实现自动登录和数据抓取。同时,需要考虑如何模拟浏览器行为,如设置User-Agent,处理Cookie和Session,以避免被网站检测到是...
"知乎爬虫.zip"这个文件可能包含了一个用于抓取知乎网站数据的Python爬虫项目。让我们详细了解一下爬虫以及如何在知乎上进行网络爬取。 首先,爬虫是一种自动遍历互联网并抓取网页信息的程序。它们模拟人类浏览器的...
高级篇讲解爬虫的高级话题,如登录认证、文件下载、执行JavaScript、动态网页爬取、使用HTTP代理、分布式爬虫的编写等,并配合项目案例讲解,包括供练习使用的网站,以及京东、知乎、豆瓣、360爬虫案例等。...
基于Scrapy的网络(微薄and知乎)爬虫文档详细+资料齐全.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请...