python爬虫 知乎_python爬虫——知乎(关于python的精华回答)
之前的文章都是与职位、热门文章有关的,今天一起来看一下知乎上与python相关的精华回答(主要是requests,scrapy处理的思路,编码问题)
知乎python精华回答
1.采集的信息
- 问题题目
- 问题对应URL
- 回答的作者
- 作者主页URL
- 回答获赞数
- 回答详情URL
主要获取以上信息,接着我们来看一下这些字段所在的位置
字段位置
通过观察和分析以上字段在源码中都能找到,所以就不用像前几篇文章那样,构造参数,解析获取返回的json数据,我们可以通过lxml.etree.HTML()或者Beautifulsoup去解析(这里在通过etree解析时遇到了一些问题,在后边会进行解释)
既然不需要通过构造参数去获取数据了,所以相对来说就简单一些了,接下来我们来看一下另一个很重要的问题——分页问题
第一页
第二页
从上面两张图片我们可以看出换页之后参数page发生了改变,很显然page控制的是页码,明白了这一点就可以去构造URL了
2.构造URL
总页数
urls = ['https://www.zhihu.com/topic/19552832/top-answers?page={}'.format(one) for one in range(1,51)]
解决了分页问题,就没什么难点了,接下来说一下遇到的问题和解决方法
通过Beautifulsoup解析页面
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
from store_csv import CSV
from store_mysql import Mysql
class zhiHu(object):
baseurl = 'https://www.zhihu.com'
headers = {
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
}
cookies = {
'd_c0': '"AHACIj6lFguPTkEZTVmz8MPJ8UkcuI03hag=|1483278273"',
'_zap': '108369f2-93e6-407e-8928-b57f44168838',
'q_c1': '0d3d690c67bc4b12a163beb462e17d67|1492571575000|1483278273000',
'cap_id': '"NmFlNDgyZmMxNWQ0NGFiYmFhZThmMGM2MDVkZDM1MWM=|1493684435|1958b2bb9fb6f09116056cc4bc5af76e00dbaff7"',
'l_cap_id': '"ZjViYmQ0MzBkNTFjNGJjOWE5YTExZWRjMjlkNjM2YjQ=|1493684435|1204e5c054805d8bebf3b49a8a2fc09e2f1bd870"',
'auth_type': '"c2luYQ==|1493684515|245a0f575f151c486829c687ba3d3c90fc5fa558"',
'token': '"Mi4wMGljWjNYRkVBNzIyRGJjZDZkMjMyZmMwM2JtMWs=|1493684515|a76491c048b7e825a77983ef0a272bdc9e721853"',
'client_i': '"NTA3MzY2MzQwNA==|1493684515|9a08a2c9a6c02e86da4810cb5bc4437f6d7b1028"',
'aliyungf_tc': 'AQAAAFOsE04F5QQAHVcc2i2qHTGdX1x0',
'acw_tc': 'AQAAAAnnBnQS0AcAHVcc2omDblHld+wt',
'_xsrf': '398e0b041f39355dadfc06b76ba18cdb',
's-q': 'python',
's-i': '1',
'sid': 'ob2ttqkg',
's-t': 'autocomplete',
'z_c0': 'Mi4wQUFBQ3hmbTFzUXNBY0FJaVBxVVdDeGNBQUFCaEFsVk5OVjR2V1FETW9QS19PRlExWGVjUHNOcFVoTG5mYWg1LUtR|1493701061|4258e8f2ddc800c42c8b7d94385f578ca97f34d5',
'__utma': '51854390.213172690.1484833633.1493684449.1493701029.4',
'__utmb': '51854390.0.10.1493701029',
'__utmc': '51854390',
'__utmz': '51854390.1493701029.4.4.utmcsr=baidu|utmccn=(organic)|utmcmd=organic',
'__utmv': '51854390.100--|2=registration_date=20170502=1^3=entry_date=20170101=1'
}
def getUrl(self):
urls = ['https://www.zhihu.com/topic/19552832/top-answers?page={}'.format(one) for one in range(1,51)]
for url in urls:
self.getData(url)
def getData(self,url):
data = requests.get(url, headers=self.headers, cookies=self.cookies).content.encode('utf-8')
soup = BeautifulSoup(data, 'lxml')
infos = soup.find_all('div', {'class': 'feed-item feed-item-hook folding'})
item = {}
for info in infos:
item[1] = info.find('a',{'class':'question_link'}).get_text().strip()
item[1] = item[1].replace("'","=")
item[2] = self.baseurl+info.find('a',{'class':'question_link'}).get('href')
try:
item[3] = info.find('a',{'class':'author-link'}).get_text()
except:
item[3] = u'匿名用户'
try:
item[4] = self.baseurl+info.find('a',{'class':'author-link'}).get('href')
except:
item[4] = u''
item[5] = info.find('a',{'class':'zm-item-vote-count js-expand js-vote-count'}).get_text()
try:
item[6] = self.baseurl+info.find('a',{'class':'toggle-expand'}).get('href')
except:
item[6] = u''
self.store(item)
def store(self,item={}):
#row = [item[i] for i in range(1,7)]
#wirte.writeRow(row)
mysql.insert(item)
if __name__ == "__main__":
#firstRow = ['问题', '问题URL', '回答者', '回答者URL', '获赞', '详细信息URL']
#wirte = CSV('zhihu.csv',firstRow)
row = ['question','qurl','autuor','aurl','zan','detail']
mysql = Mysql('zhihu',row,7)
mysql.create_table()
zhihu = zhiHu()
zhihu.getUrl()
这里说明一点,from store_csv import CSV,from store_mysql import Mysql这两个是自己写的两个类,实现方法可以参考python简单操作csv文件小例和老哥Mr_Cxy的python对Mysql数据库的操作小例这两篇文章,这里可以不添加cookie信息
通过etree解析页面(和之前一样都是找到循环点,然后取值,这里主要说一下遇到的问题和解决的方法)
问题
html = requests.get(url,headers=headers)
这里有不同方式,一种是html.content,另一种是html.text之前没遇到出错的情况(通过content出现了编码问题,python版本2.7),今天遇到了就记录一下:
resp.text返回的是Unicode型的数据。
resp.content返回的是bytes型也就是二进制的数据。
也就是说,如果你想取文本,可以通过r.text。
如果想取图片,文件,则可以通过r.content。
方法
主要说一下html.content的解决方案
selector = etree.HTML(html.content.decode('utf-8'))
通过对html.content进行解码,输出结果正常。
3.scrapy版本思路
1.使用start_requests()重写初始URL控制或者在parse函数中进行分页的控制
yield scrapy.Request(url,callback=self.parse)
代码中提到的URL指的是下一页的URL,通过获取下一页信息调用parse函数抓取信息
下一页
2.之前通过观察URL,我们发现只有page之后的数字发生了变化,所以我们可以使用爬取规则CrawlSpider去获取不同页面的信息(给一个之前抓取智联招聘职位详情页面的规则作为参考)
# -*- coding: utf-8 -*-
from scrapy.spider import CrawlSpider,Rule
from scrapy.linkextractors import LinkExtractor
from ..items import ZlzpItem
class ZLZP_Spider(CrawlSpider):
name = 'ZLZP'
start_urls = [
'http://jobs.zhaopin.com/'
]
rules = [
Rule(LinkExtractor(allow=('http://jobs.zhaopin.com/[a-zA-Z0-9]*\.htm',)), follow=True,
callback='parse_item')]
def parse_item(self, response):
这里使用了parse_item进行页面数据的提取(编写爬虫规则时,避免使用 parse 作为回调函数。 由于 CrawlSpider 使用 parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider 将会运行失败。)
关于CrawlSpider 的详细使用方法可以参考官方文档或者参考相关的代码和文章
4.数据信息(mysql和csv)
mysql
zhihu.csv
总结
通过对比动态网页(ajax)和静态网页,在思想上差别不是很大(参数+分页),在解析方式动态的一般都是通过解析json来获取数据,静态则通过Beautifulsoup、xpath、正则去获取数据。
爬爬爬,下一个网站走起!
python爬虫 知乎_python爬虫——知乎(关于python的精华回答)相关推荐
- python网页爬虫循环获取_Python 爬虫第三篇(循环爬取多个网页)
本篇是 python 爬虫的第三篇,在前面两篇 Python 爬虫第一篇(urllib+regex) 和 Python 爬虫第二篇(urllib+BeautifulSoup) 中介绍了如何获取给定网址 ...
- python获取网站代码_python爬虫1——获取网站源代码(豆瓣图书top250信息)
# -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...
- python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)
前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...
- python爬虫教程大全_python爬虫入门教程
爬虫是一个是一个好玩的技术,偷偷爬取mm的照片,爬取知乎用户头像等等,这些教程经验帖在网上随便一搜,到处都是:那么今天小编将给大家简单讲讲python爬虫的入门.鉴于经验排版模式有限,所以这里只能简单 ...
- python爬虫实验报告_python爬虫实验
原博文 2013-06-28 13:30 − 那天在新浪微博上看到北北出的题目,由于最近也在做类似的爬虫研究,所以就有了这个实验. 后来在QQ上和北北说了下,要求是啥都抓,就抓乌云的... 然后就开始 ...
- python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...
Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...
- 如何运用python爬游戏皮肤_Python爬虫实战之 爬取王者荣耀皮肤
王者荣耀是目前非常火的一款游戏,相信大家都对其中的人物很感兴趣,那么今天就带大家来爬取王者荣耀的皮肤,可以选一款喜欢的来当电脑壁纸.第一步,拿到url地址 第二步,获取各个人物皮肤数据 第三步,保存文 ...
- python爬虫自学路线_python 爬虫学习路线:从入门到进阶
大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...
- python爬虫资源大全_Python爬虫抓取纯静态网站及其资源(基础篇)
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:程序员宝库 **( 想要学习Python?Python ...
最新文章
- IDEA出现import org.junit.Test飘红解决方案
- codevs 1230【pb_ds】
- Node.js 切近实战(十一) 之实时通讯
- 选择大公司还是小公司
- 网站能拿到其他网站的cookie_网站能给公司带来哪些好处?
- Java——网络编程练习
- 《C++ Primer 5th》笔记(6 / 19):函数
- javascript-dom-文档对象模型
- accept 返回0_从0开始理解Vite的主要新特性(一)
- iphone11边框喇手问题_iPhone12手感如何 直角边框真的会割手吗?
- PHP异步调用实现方式
- 分享改进 完全定制自己的代码生成器
- jQuery 图片轮播插件–GalleryView
- Visual Studio开发环境下的中文GBK内码获取
- 〖工具〗Ladon 8.4 Cobalt Strike插件发布
- 机器学习之BP算法推导
- 计算广告中的名词解释
- 2016最新iOS开发证书配置和安装的详细步骤攻略
- Memery of habit
- 计算机 常用的逻辑运算有哪些,常用布尔逻辑运算符有哪些
热门文章
- 办公计算机应用常用软件,办公自动化及常用工具软件
- oracle如何添加小数点,Oracle处理保留小数点
- “已连接,但无法访问互联网”开机后wifi有感叹号, 时间无法同步解决办法
- 从苹果、SpaceX等高科技企业的产品发布会看企业产品战略和敏捷开发的关系
- B站声音太小怎么办,一款插件帮你解决
- android用服务建立悬浮窗,Android悬浮窗用法总结
- Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试
- ubuntu 拨号上网(PPPOE)
- 简单搜索--BFS--Catch That Cow
- 计算机公办学校招收人数,2018长沙市小升初微机派位一共有多少人参加