python 爬取世纪佳缘,经过js渲染过的网页的爬取
#!/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"))
python 爬取世纪佳缘,经过js渲染过的网页的爬取的更多相关文章
- python多线程爬取世纪佳缘女生资料并简单数据分析
一. 目标 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...
- 世纪佳缘信息爬取存储到mysql,下载图片到本地,从数据库选取账号对其发送消息更新发信状态
利用这种方法,可以把所有会员信息存储下来,多线程发信息,10秒钟就可以对几百个会员完成发信了. 首先是筛选信息后爬取账号信息, #-*-coding:utf-8-*- import requests, ...
- 批量采集世纪佳缘会员图片及winhttp异步采集效率
原始出处:http://www.cnblogs.com/Charltsing/p/winhttpasyn.html 最近老有人问能不能绕过世纪佳缘的会员验证来采集图片,我测试了一下,发现是可以的. 同 ...
- java_爬虫_获取经过js渲染后的网页源码
md 弄了一天了……(这个月不会在摸爬虫了,浪费生命) 进入正题: 起初是想写一个爬虫来爬一个网站的视频,但是怎么爬取都爬取不到,分析了下源代码之后,发现源代码中并没有视频的dom 但是在浏览器检查元 ...
- (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据
又是一年双十一了,不知道从什么时候开始,双十一从“光棍节”变成了“双十一购物狂欢节”,最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻着安静到死寂的聊天列表,我忽然惊醒,不行 ...
- 模仿世纪佳缘网站PC端的首页效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python通过PhantomJS获取JS渲染后的网页源代码
新建一个文件,命名为test.js,内容如下: var page = require('webpage').create(), system = require('system'), address; ...
- 2)JS动态生成HTML元素的爬取
2)JS动态生成HTML元素的爬取 import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.W ...
- 关于js渲染网页时爬取数据的思路和全过程(附源码)
于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...
随机推荐
- nginx目录路径重定向[转]
如果希望域名后边跟随的路径指向本地磁盘的其他目录,而不是默认的web目录时,需要设置nginx目录访问重定向. 应用场景:dashidan.com/image自动跳转到dashidan.com/fol ...
- 关于jQuery UI 使用心得及技巧
1 jQuery UI 有时你仅仅是为了实现一个渐变的动画效果而不得不把javascrip 重新学习一遍然后书写大量代码.直到jQuery的出现,让开发人员从一大堆繁琐的js代码中解脱,取而代之几行j ...
- XML & JSON---iOS-Apple苹果官方文档翻译
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong //转载请注明出处--本文永久链接 ...
- Java 9 中的 9 个新特性
Java 8 发布三年多之后,java9已经发布了 . 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 Java 9 一起发布. 1 ...
- Node.js的开源博客系统Ghost搭建教程
准备工作 Node.js版本:0.10.x.0.12.x.4.2.x.安装步骤可参考:Node.js环境搭建 Ghost版本:0.7.4:中文集成版(33.6M),中文标准版(3.39M),英文原版( ...
- python基础===数据伪造模块faker
介绍文档: https://pypi.org/project/Faker/ https://faker.readthedocs.io/en/latest/ https://faker.readthed ...
- SQLite3使用详解
sqlite常量的定义(SQLite3返回值的意思): SQLITE_OK = 0; 返回成功 SQLITE_ERROR = 1; SQL错误或错误的数据库 SQ ...
- JS时间转换的一个坑位
在做项目的时候,无意发现了一个小东西. new Date('2018-05-15') new Date('2018-5-15') 输出的结果是不同的,相差了8小时.然后让我回忆到之前看的一个时间转换函 ...
- linux系统查找具体进程
ps -ef | grep '查找内容' eg:ps -ef | grep '测试USB设备穿透'
- Python语言库pyttsx3
这是一个文字转语音的python模块. 1. macos下安装的时候出现问题: 后来发现,Foundation, AppKit, PyObjCTools都不存在,主要原因是缺少依赖模块pyobjc, ...