# -*- coding: utf-8 -*-
"""
Created on Mon Jul 8 16:59:12 2019
@author: Administrator
"""
import requests
import re
from lxml import etree
import json
import time
import random
import collections
from pymongo import MongoClient
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
"""
# 提取json数据文本
pat_json = re.compile('</script><script id="js-initialData" type="text/json">(.*)</script><script src="https://static.zhihu.com/heifetz/vendor.6c16e03dca561b828324.js">')
response_json = re.findall(pat_json,response.text)[0]
# 解析json数据
json.loads(response_json)
# 取出关注人的账号
user_following = list(json.loads(response_json ).get('initialState')['entities']['users'].keys())[1:]
# 构造关注人follow页面网址
user_urls = ['https://www.zhihu.com/people/'+name+'/following' for name in user_following]
"""
# 定义单用户爬虫函数
def spider(user_urls):
# 对用户网址做出响应,添加用户代理
response = requests.get(user_urls,headers=headers)
#设置等待时间,反正爬虫被发现
time.sleep(random.randint(3,6))
# 找出json数据文本
pat_json = re.compile('</script><script id="js-initialData" type="text/json">(.*)</script><script src="https://static.zhihu.com/heifetz/vendor.6c16e03dca561b828324.js">')
response_json = re.findall(pat_json,response.text)[0]
# 解析json数据并提取用户所关注人的账号
user_following = list(json.loads(response_json ).get('initialState')['entities']['users'].keys())[1:]
# 构造用户所关注的人的网址
other_urls = ['https://www.zhihu.com/people/'+name+'/following' for name in user_following]
# 构造选择器
selector = etree.HTML(response.text)
# 提取出昵称
name = selector.xpath('//*[@class="ProfileHeader-name"]/text()')[0]
# 提取出行业职位
try:
prefession = selector.xpath('//*[@class="ProfileHeader-infoItem"]/text()')[0]
except:
prefession = ''
# 提取出关注人数
try:
following = selector.xpath('//*[@class="Card FollowshipCard"]/div/a[1]/div/strong/text()')[0]
except:
following = ''
# 提取出被关注人数
try:
follower = selector.xpath('//*[@class="Card FollowshipCard"]/div/a[2]/div/strong/text()')[0]
except:
follower = ''
print(name)
collection.insert_one({'name':name,'prefession':prefession,'following':following,'follower':follower})
return other_urls
# 待爬取url加入队列
next_crawl_urls = collections.deque()
# 初始化一个urls,再进入循环
next_crawl_urls.append('https://www.zhihu.com/people/asdfghjkl-54-99/following')
# 连接数据库,初始化cliet
client = MongoClient()
# 建立数据库
db = client.zhihu
# 建立数据表
collection = db.user
# 已经被爬取的url,利用集合是唯一性进行去重
crawled_urls = set()
while True:
# 使用popleft方法从待爬取的uels中提取其中一个url后,并删除已提取的url
url = next_crawl_urls.popleft()
try:
other_urls = spider(url)
crawled_urls.add(url)
# 待爬取减去已经爬取的,得出未爬取过的urls
no_crawl_url = set(other_urls) - crawled_urls
# 将未爬取的urls放进待爬取的队列中
next_crawl_urls.extend(no_crawl_url)
except:
pass
```
笔记2
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 查看帮助命令(2.2,P30-33) 一、命令的长格式和短格式 长格式:man --help 短格式:man -h...
- 2.3的内容完全是卡尔曼滤波。涉及很多公式和练习其实阅读起来并没有那么友好。所以卡尔曼滤波的部分会简略来说,只讲o...
- 2.4主要讲了卡尔曼滤波和激光&雷达系统的联动,主讲的是奔驰团队的羞涩小哥。例子里面这个系统主要考虑追踪人。其实车...
- 【精华内容】当我们想请对方参与一件事的时候,常见的误区,是把这件事说得太完美、太诱人,以致让对方产生压力。...
- Udacity上面有关于无人车的视频,第一学期应该是Nvidia主导的。里面全是视觉的部分,感觉可以直接跳过了。不...