#!/usr/bin/python
#-*- coding:utf-8 -*- #爬取世纪佳缘
#这个网站是真的烦,刚开始的时候用scrapy框架写,但是因为刚接触框架,碰到js渲染的页面之后就没办法了,所以就采用一般的爬虫了
#js渲染过的数据,可能在网页源码里面没有数据,需要js异步请求提取数据,然后展示,所以爬取这类的数据,只需要找到js发送请求的url就行了
#js发送的请求可能是post(比如这个例子)或者是get(比如豆瓣电影剧情的排行榜),所以要看好是什么请求 import sys
import json
#from lxml import etree
import urllib
import urllib2 reload(sys)
sys.setdefaultencoding("utf-8") #设置默认的编码格式,把Unicode格式转换成汉字写到文件里面的时候需要用到,要配合decode("unicode_escape")使用 class shiji():
def __init__(self):
self.page = 1 #初始化页面的第几页
self.filename = open("sj.json","w") #打开文件用于写入数据 def parse_page(self):
url = "http://search.jiayuan.com/v2/search_v2.php?" #初始url的前半段,加上后半段发送的是post请求
headers = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"}
formdata = {
"sex":"f",
"key":"",
"stc":"1:11,2:20.25,3:160.170,23:1",
"sn":"default",
"sv":"1",
"p":self.page, #每次数据js异步提取数据的时候只有p变化了,p对应于当前页面是第几页
"f":"select",
"listStyle":"bigPhoto",
"pri_uid":"170633820",
"jsversion":"v5"
}
data = urllib.urlencode(formdata)
request = urllib2.Request( url ,data = data , headers = headers)
response = urllib2.urlopen(request)
# print response.info().get('Content-Encoding') #这会打印出服务器返回数据的压缩方式,如果未有压缩则返回None
js = response.read() #返回的response.read()是json格式的,但是首和尾多了一段字符串"##jiayse##"和"##jiayse##",所以下面就处理一下 #print type(js) #字符串类型
js = js.replace("##jiayser##","").replace("//","") #字符串里很牛X的一个函数replace()
#print js
content = json.loads(js) #字典类型(这个字典是大字典,key只有isLogin、count、pageTotal、userInfo,其中userInfo是每个人的资料) self.parse_person(content['userInfo']) #调用parse_person函数处理大字典的ueerInfo(还是字典类型的),即每个人的资料
# print type(content['userInfo'])#字典类型 def parse_person(self,userinfo):
for i in range(len(userinfo)): form = {"昵称":userinfo[i]['nickname'],"年龄":userinfo[i]['age'],"内心独白":userinfo[i]['shortnote']} #把要爬取的数据写成一个字典 #print form
#print type(form) #不能把dict和list类型直接写入文件, 把字典写入json文件的时候要把字典转换成json字符串才行(json.dumps(form))
#decode("unicode_escape")表示把unicode格式转换成汉字,但用一个这竟然还不行!还要加上上面的import sys... , 真麻烦
form = json.dumps(form).decode("unicode_escape") self.filename.write(form+"\n") #写入文件 if self.page <10: #这里随便写self.page,只要不超过页面加载的范围就行
self.page+=1
self.parse_page() #自加一之后在调用parse_page()函数进行换页,然后接着爬 if __name__ == "__main__":
sj = shiji()
sj.parse_page() #调用parse_page()函数开始爬取
写这个爬虫浪费了一天的时间。。。我是真的菜。

错误总结:
关于unicode编码转汉字的方法以及UnicodeEncodeError: 'ascii' codec can't encode characters in position问题:
https://www.cnblogs.com/technologylife/p/6071787.html
http://blog.sina.com.cn/s/blog_64a3795a01018vyp.html 把dict写入文件的时候碰见的报的typeError的解决办法: http://blog.csdn.net/guoweish/article/details/47106263 另外加一篇ubuntu vim撤销操作的博客 http://blog.sina.com.cn/s/blog_7e9efc570101ays3.html 收获:这次的收获还可以,解决了很多没见过的bug,第一次爬取js渲染的网页的数据,值得记得的是:(1).js渲染过得网页怎么找数据来源(f12 network XHR 找是post请求还是get请求),(2)字符串的强大替换函数replace,(3)字典写入文件怎么处理 (先转换成json的字符串再写入),(4)unicode转汉字怎么处理(import sys + decode("unicode_escape"))

最新文章

  1. [JAVA] java class 基本定义 Note
  2. javascript this关键字指向详解
  3. hdu-----(2807)The Shortest Path(矩阵+Floyd)
  4. tic/toc/cputime测试时间
  5. 新手不了解Xcode和mac系统可能犯得错误和我的建议
  6. Java学习之路:2、Mysql 链接与查询
  7. Android中shape属性详解
  8. DB2 WIN7 WIN8在指示的文件系统中找不到数据库目录
  9. i++与++i的区别,使用实例说明
  10. jmeter+ant+jenkins+mac 构建后自动发送邮件
  11. 游戏开发之UE4添加角色到场景中
  12. JAVA虚拟机系列文章
  13. AngularJs踩过的坑
  14. windows10安装anaconda,配置tensorflow
  15. Spring事务失效的原因
  16. Case Study: 技术和商业的结合点在哪里?
  17. log parser 微软iis 日志分析
  18. 功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部
  19. Big Number------HDOJ杭电1212(大数运算)
  20. 8个免费且实用的C++ GUI库(转载)

热门文章

  1. PAT 1009. Triple Inversions (35) 数状数组
  2. [php]HTTP协议头解析
  3. [NOIP2003]栈 题解(卡特兰数)
  4. Oracle笔记之序列(Sequence)
  5. 【Explain】mysql之explain详解(分析索引的最佳使用)
  6. 环境变量配错了 command not found
  7. thinkphp中的验证器
  8. netif_receive_skb-&gt;__netif_receive_skb_core
  9. sqlite3在Linux下的安装和使用
  10. C/C++——[04] 语句