#!/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渲染过的网页的爬取的更多相关文章

  1. python多线程爬取世纪佳缘女生资料并简单数据分析

    一. 目标 ​ 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...

  2. 世纪佳缘信息爬取存储到mysql,下载图片到本地,从数据库选取账号对其发送消息更新发信状态

    利用这种方法,可以把所有会员信息存储下来,多线程发信息,10秒钟就可以对几百个会员完成发信了. 首先是筛选信息后爬取账号信息, #-*-coding:utf-8-*- import requests, ...

  3. 批量采集世纪佳缘会员图片及winhttp异步采集效率

    原始出处:http://www.cnblogs.com/Charltsing/p/winhttpasyn.html 最近老有人问能不能绕过世纪佳缘的会员验证来采集图片,我测试了一下,发现是可以的. 同 ...

  4. java_爬虫_获取经过js渲染后的网页源码

    md 弄了一天了……(这个月不会在摸爬虫了,浪费生命) 进入正题: 起初是想写一个爬虫来爬一个网站的视频,但是怎么爬取都爬取不到,分析了下源代码之后,发现源代码中并没有视频的dom 但是在浏览器检查元 ...

  5. (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据

    又是一年双十一了,不知道从什么时候开始,双十一从“光棍节”变成了“双十一购物狂欢节”,最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻着安静到死寂的聊天列表,我忽然惊醒,不行 ...

  6. 模仿世纪佳缘网站PC端的首页效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Python通过PhantomJS获取JS渲染后的网页源代码

    新建一个文件,命名为test.js,内容如下: var page = require('webpage').create(), system = require('system'), address; ...

  8. 2)JS动态生成HTML元素的爬取

    2)JS动态生成HTML元素的爬取 import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.W ...

  9. 关于js渲染网页时爬取数据的思路和全过程(附源码)

    于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...

随机推荐

  1. nginx目录路径重定向[转]

    如果希望域名后边跟随的路径指向本地磁盘的其他目录,而不是默认的web目录时,需要设置nginx目录访问重定向. 应用场景:dashidan.com/image自动跳转到dashidan.com/fol ...

  2. 关于jQuery UI 使用心得及技巧

    1 jQuery UI 有时你仅仅是为了实现一个渐变的动画效果而不得不把javascrip 重新学习一遍然后书写大量代码.直到jQuery的出现,让开发人员从一大堆繁琐的js代码中解脱,取而代之几行j ...

  3. XML & JSON---iOS-Apple苹果官方文档翻译

      技术博客http://www.cnblogs.com/ChenYilong/   新浪微博http://weibo.com/luohanchenyilong   //转载请注明出处--本文永久链接 ...

  4. Java 9 中的 9 个新特性

    Java 8 发布三年多之后,java9已经发布了 . 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 Java 9 一起发布.   1 ...

  5. Node.js的开源博客系统Ghost搭建教程

    准备工作 Node.js版本:0.10.x.0.12.x.4.2.x.安装步骤可参考:Node.js环境搭建 Ghost版本:0.7.4:中文集成版(33.6M),中文标准版(3.39M),英文原版( ...

  6. python基础===数据伪造模块faker

    介绍文档: https://pypi.org/project/Faker/ https://faker.readthedocs.io/en/latest/ https://faker.readthed ...

  7. SQLite3使用详解

    sqlite常量的定义(SQLite3返回值的意思): SQLITE_OK           = 0;  返回成功 SQLITE_ERROR        = 1;  SQL错误或错误的数据库 SQ ...

  8. JS时间转换的一个坑位

    在做项目的时候,无意发现了一个小东西. new Date('2018-05-15') new Date('2018-5-15') 输出的结果是不同的,相差了8小时.然后让我回忆到之前看的一个时间转换函 ...

  9. linux系统查找具体进程

    ps -ef | grep '查找内容' eg:ps -ef | grep '测试USB设备穿透'

  10. Python语言库pyttsx3

    这是一个文字转语音的python模块. 1. macos下安装的时候出现问题:  后来发现,Foundation, AppKit, PyObjCTools都不存在,主要原因是缺少依赖模块pyobjc, ...