前言

  昨天继任团支书向我抱怨说,青年之声的问题收到了很多人的答复,问题还成为了热门问题。
  想必到时候统计将会非常麻烦。
  回想起去年我苦逼的团支书生涯,我就对这个统计的痛苦感同身受。
  不过经过了一年Python以及前端的学习,我觉得自己可以通过爬虫来解决这个令人痛苦的难题了。

代码编写

  暑假的时候有看过Python的入门教程,教程中就有讲到如何使用Python抓取页面的一些讯息。(就是爬虫)
  于是我从新把代码拿出来进行操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# -*- coding: utf-8 -*-

import re
import urllib
from urllib import request

def getHtml(url):
values = {'name': 'voidking','language': 'Python'}
data = urllib.parse.urlencode(values).encode(encoding='utf-8',errors='ignore')
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0' }
offer = request.Request(url=url, data=data,headers=headers,method='GET')
page = request.urlopen(offer)
html = page.read().decode('utf-8')
return (html)

def getVideoUrl(html):

reg = r'src="(.*?\.js)"'

imgReg = re.compile(reg)
imglist = re.findall(imgReg,html)
fnew = open('worm/data.txt','w')
x=0

for imgurl in imglist:
# request.urlretrieve(imgurl,'%s.png' %x)

fnew.write(imgurl + "\n")
x+=1

fnew.close()

html = getHtml("https://www.12355.net/wechat/view/find_consult/find_consult_question_detail.html?quId=10087550&username=25133106")
print (getVideoUrl(html))

  代码其实并不复杂,但是之前写好的代码运行却是发生错误。
  主要是 from urllib import request 这行报错了
  为了解决这个问题,我又查了很多资料,还涉及到 Python2 和 Python3 的坑

1
2
3
4
5
6
7
8
import urllib2
def getHtml(url):
request = urllib2.Request(url)
#模拟Mozilla浏览器进行爬虫
request.add_header("user-agent","Mozilla/5.0")
response2 = urllib2.urlopen(request)
html = response2.read().decode('utf-8')
return (html)

  这样子执行代码就可以定位获取到html页面
  然而定好规则之后我却无法获取到相关的评论信息。
  这个问题我卡了很久,因为用浏览器链接是可以看到评论的。
  我在猜测莫非是我没有模拟出浏览器访问页面的效果吗?
  于是我用postman再次尝试访问页面。

  然而懵逼的情况出现了。
postman
  postman也是返回了全空的html页面
  这个情况我没有遇到过,也不清楚问题出在哪里。
  我猜测可能是因为访问页面没有模仿出浏览器访问的效果,可能还是缺少了某些头文件吧。
头文件
  于是我尝试着将页面中一些相关的头文件输入到postman中,然并卵。

  最后我只好将postman中返回的页面复制到VScode中,在和原页面中比对,那里的html出问题了。
网页文件
源文件
  经过自己的一番对比,我发现了问题的关键所在。
源文件

  没错,评论的加载类似于瀑布流。
  只有拖动到相应的位置才会加载出更多的评论。
  于是我在网上搜索如何抓取动态页面的内容。下面这个网站给了我很大的启发。
  https://blog.csdn.net/dawn_yue/article/details/78352335
  动态页面是通过接口地址获取的json解析出来的。
  那我直接截取json数据就好了。
源文件

  于是当我打开接口页面即可获取到相关的json数据。
源文件
  但是这样只能获取到部分的评论数据,如何才能获取所有的评论呢?
源文件
  稍微修改一些地址上的参数,就可以获取相应的所有评论数据。

  于是我将路径的地址修改为接口的地址。
  成功获取到了所需要的json数据。
源文件

  后续的操作都不是大问题,遇到的坑是decode有关的。
  使用 decode(‘utf-8’) 在cmd中不会输出乱码 ,但是读写文件的时候报错。
  所以最后我没有使用 decode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# -*- coding: utf-8 -*-

import re
import urllib2

studentName = ["张三","李四"]

def getHtml(url):
request = urllib2.Request(url)
#模拟Mozilla浏览器进行爬虫
request.add_header("user-agent","Mozilla/5.0")
response2 = urllib2.urlopen(request)
html = response2.read()
return (html)

def getVideoUrl(html):

reg = r'"creatorName":"(.*?)"'

nameReg = re.compile(reg)
nameList = re.findall(nameReg,html)

with open('worm/data.txt','w') as fnew:
for name in studentName:
fnew.write("%s " % name)
for creatorName in nameList:
if name == creatorName:
fnew.write("合格\n")
break
else:
fnew.write("\n")

return studentName

quId = "10087550"

url = "https://api.12355.net/pc/service/getReplysByQuestionId?quId=%s&page=1&rows=500" % quId

html = getHtml(url)
getVideoUrl(html)

  如此执行完之后,会输出这个txt文档
源文件
  后面就是将相关的数据输入到excel表格即可。

总结

  学了一年的前端,感觉之前的学习都没有白费,充分体会到知识积累的重要性。
  爬虫并没有想象中的艰难
  (其实很困难,之前尝试过抓取Pluralsight视频链接,结果失败了)
  最近其实状态不是十分好,硬着头皮看 Pluralsight - Procedural Cities with Houdini and Python 教程
  虽然霆宇也在研究,不过自己也想学,但是这套教程还是挺复杂的,目前看了40多集,思路还没有完全理清楚。
  很快就要去华强方特那边实习了,所以师兄在催促我加快学习Qt的进度。
  正好我也想给这个爬虫开发个GUI界面,简化爬虫的复杂程度。
  自动城市的教程得先搁置了,Qt,我来也!!!