您的位置:首页 > 编程语言 > Python开发

记第一次写出自己的简单python爬虫:GCZW3

2018-03-11 21:17 543 查看
经过差不多一个星期的折腾,当然这其中也有做很多其他事情。周四写出来直接通过浏览器Network找到观察者网评论链接进行的爬虫,今天下午有折腾了差不多一下午,终于通过BeautifulSoup解析出的html中找到了data-id,也就是构造评论链接的关键。



找到了data-id之后,这样就可以把每篇文章和其评论建立联系。这样接下来的通过文章链接,直接爬评论的想法就可以水到渠成了。而下午的主要时间都花费在怎么data-id解析提取出来。尝试了很多方法,比如先找到 class = gc-comment 的div 标签,这时候得到是list类型,然后将list类型转变为string类型,可是这期间总是出错,解决这个问题的关键在于 确定 变量的数据类型,不同的数据类型处理方法不同!



gc_comment = soup.select('div.gc-comment')#[<div class="gc-comment" data-from="cms" data-id="355103" data-type="1" id="comments-container">]最后发现把得到的gc_comment是list类型,并且令str = gc_comment[0]后,str并不是我认为的string类型,通过print(type(str))得知str是<class 'bs4.element.Tag'>,也就是说str是bs4类型,想要得到data-id中的数据,必须采用bs4提取数据的方法!因此用str.attrs['data-id'],得到data-id的值。


到这里,接下来的程序就很好写了,没过多久,一个带有三个函数的程序就被我编写出来了。这还是自己第一次亲自编出python爬虫,虽然功能很简单,但这也是对我近期python学习的一个总结和肯定。这次花费很多时间在提取data-id上,说明对python最简单的基础知识还没有掌握,接下来要着重掌握。
最后贴出观察者网热评python源代码:#!/user/bin/env python
# -*- coding:utf-8 -*-
# author :Guoz time:2018/3/11

import requests
from bs4 import BeautifulSoup
import json
import re
import urllib
from urllib import request

def get_TitleandDataid(url):
try:
# kv = {'wd':keyword}
r = requests.get(url)
#print(r.request.url)
r.raise_for_status()
r.encoding = r.apparent_encoding
#print(r.status_code)
# print(r.text)
#print(len(r.text))

demo = r.text
soup = BeautifulSoup(demo, "html.parser")
articleTitle = soup.title.text
gc_comment = soup.select('div.gc-comment') # 用soup.select找到data-id所在的div

#print(articleTitle.text)
str = gc_comment[0]
#print(str.attrs['data-id']) # 在对数据进行提取时 关键是找到明确数据的类型,不同的类型,操作方式不同

data_id = str.attrs['data-id']
print(articleTitle)

except:
print("标题和Data-id爬取失败!")

return data_id
return articleTitle

def get_cmtsUrl(data_id):
cmtsUrl = ('http://user.guancha.cn/comment/cmt-list.json?codeId='+data_id+'&codeType=1&pageNo=1&order=1&ff=www')
return cmtsUrl

def get_hotcmts(cmtsUrl):
try:
with request.urlopen(cmtsUrl, timeout=10) as response:
content = response.read()
except Exception as e:
content = None
print('crawl data exception.' + str(e))

allContent = json.loads(content)['hots']
i = 0
for item in allContent:
i = i + 1
print('热评NO.%s:\n' % (i))
print(item['content'] + '\n')
print('反对:%s 支持:%s' % (item['tread_num'], item['praise_num']))
print('------' * 30 + '\n')

def main(url):

data_id = get_TitleandDataid(url)
#print(data_id)

cmtsUrl = get_cmtsUrl(data_id)

#print(cmtsUrl)
hotcmts = get_hotcmts(cmtsUrl)
print(hotcmts)

url = ("http://www.guancha.cn/kegongliliang/2018_03_05_448905.shtml")
main(url)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息