之前的文章都是与职位、热门文章有关的,今天一起来看一下知乎上与python相关的精华回答(主要是requests,scrapy处理的思路,编码问题)

知乎python精华回答

1.采集的信息

  1. 问题题目
  2. 问题对应URL
  3. 回答的作者
  4. 作者主页URL
  5. 回答获赞数
  6. 回答详情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的精华回答)相关推荐

  1. python网页爬虫循环获取_Python 爬虫第三篇(循环爬取多个网页)

    本篇是 python 爬虫的第三篇,在前面两篇 Python 爬虫第一篇(urllib+regex) 和 Python 爬虫第二篇(urllib+BeautifulSoup) 中介绍了如何获取给定网址 ...

  2. python获取网站代码_python爬虫1——获取网站源代码(豆瓣图书top250信息)

    # -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...

  3. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  4. python爬虫教程大全_python爬虫入门教程

    爬虫是一个是一个好玩的技术,偷偷爬取mm的照片,爬取知乎用户头像等等,这些教程经验帖在网上随便一搜,到处都是:那么今天小编将给大家简单讲讲python爬虫的入门.鉴于经验排版模式有限,所以这里只能简单 ...

  5. python爬虫实验报告_python爬虫实验

    原博文 2013-06-28 13:30 − 那天在新浪微博上看到北北出的题目,由于最近也在做类似的爬虫研究,所以就有了这个实验. 后来在QQ上和北北说了下,要求是啥都抓,就抓乌云的... 然后就开始 ...

  6. python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...

    Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...

  7. 如何运用python爬游戏皮肤_Python爬虫实战之 爬取王者荣耀皮肤

    王者荣耀是目前非常火的一款游戏,相信大家都对其中的人物很感兴趣,那么今天就带大家来爬取王者荣耀的皮肤,可以选一款喜欢的来当电脑壁纸.第一步,拿到url地址 第二步,获取各个人物皮肤数据 第三步,保存文 ...

  8. python爬虫自学路线_python 爬虫学习路线:从入门到进阶

    大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...

  9. python爬虫资源大全_Python爬虫抓取纯静态网站及其资源(基础篇)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:程序员宝库 **( 想要学习Python?Python ...

最新文章

  1. IDEA出现import org.junit.Test飘红解决方案
  2. codevs 1230【pb_ds】
  3. Node.js 切近实战(十一) 之实时通讯
  4. 选择大公司还是小公司
  5. 网站能拿到其他网站的cookie_网站能给公司带来哪些好处?
  6. Java——网络编程练习
  7. 《C++ Primer 5th》笔记(6 / 19):函数
  8. javascript-dom-文档对象模型
  9. accept 返回0_从0开始理解Vite的主要新特性(一)
  10. iphone11边框喇手问题_iPhone12手感如何 直角边框真的会割手吗?
  11. PHP异步调用实现方式
  12. 分享改进 完全定制自己的代码生成器
  13. jQuery 图片轮播插件–GalleryView
  14. Visual Studio开发环境下的中文GBK内码获取
  15. 〖工具〗Ladon 8.4 Cobalt Strike插件发布
  16. 机器学习之BP算法推导
  17. 计算广告中的名词解释
  18. 2016最新iOS开发证书配置和安装的详细步骤攻略
  19. Memery of habit
  20. 计算机 常用的逻辑运算有哪些,常用布尔逻辑运算符有哪些

热门文章

  1. 办公计算机应用常用软件,办公自动化及常用工具软件
  2. oracle如何添加小数点,Oracle处理保留小数点
  3. “已连接,但无法访问互联网”开机后wifi有感叹号, 时间无法同步解决办法
  4. 从苹果、SpaceX等高科技企业的产品发布会看企业产品战略和敏捷开发的关系
  5. B站声音太小怎么办,一款插件帮你解决
  6. android用服务建立悬浮窗,Android悬浮窗用法总结
  7. Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试
  8. ubuntu 拨号上网(PPPOE)
  9. 简单搜索--BFS--Catch That Cow
  10. 计算机公办学校招收人数,2018长沙市小升初微机派位一共有多少人参加