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

正则爬取糗事百科

2017-12-12 20:42 92 查看
其中涉及到了对于消息头的使用
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }

设置请求的身份,如果没有,服务器可能会没有响应
这个可以为任意的,没有每个网页规定的。通过后面的学习,知道网页该部分的查找位置在查看元素-网络中。
request = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(request)
content = response.read().decode('utf-8')

pattern_author = re.compile(u'<h2>(.*?)</h2>',re.S)
pattern_content = re.compile(u'<div class="content">\n<span>\n\n\n(.*?)</span>',re.S)
pattern_comment = re.compile(u'<i class="number">(\d*)</i> 评论',re.S)

find_author = re.findall(pattern_author, content)+find_author
find_content = re.findall(pattern_content, content)+find_content
find_comment = re.findall(pattern_comment, content)+find_comment

当时是作为将作者、评论、时间进行分开爬取的,其中:
 
urllib2.urlopen(url[, data][, timeout]) #传url时候,用法同urllib里的urlopen II.1.1 它打开URL网址,url参数可以是一个字符串url或者是一个Request对象。可选的参数timeout,阻塞操作以秒为单位,如尝试连接(如果没有指定,将使用设置的全局默认timeout值)。urlopen方法也可通过建立了一个Request对象来明确指明想要获取的url。调用urlopen函数对请求的url返回一个response对象。这个response类似于一个file对象,所以用.read()函数可以操作这个response对象
 
compile(pattern [, flags]) ,该函数根据包含的正则表达式的字符串创建模式对象。可以实现更有效率的匹配。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。

 完整代码如下:
#coding:utf-8
import urllib2
import re
import os
savedir = 'D:\picture\\'
find_author = []
find_comment = []
find_content = []
for page in range(1, 5):
url = 'https://www.qiushibaike.com/8hr/page/' + str(page)
print page
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }

request = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(request)
content = response.read().decode('utf-8')

pattern_author = re.compile(u'<h2>(.*?)</h2>',re.S)
pattern_content = re.compile(u'<div class="content">\n<span>\n\n\n(.*?)</span>',re.S)
pattern_comment = re.compile(u'<i class="number">(\d*)</i> 评论',re.S)

find_author = re.findall(pattern_author, content)+find_author
find_content = re.findall(pattern_content, content)+find_content
find_comment = re.findall(pattern_comment, content)+find_comment
# os.mkdirs(savedir)
file = open(savedir + 'text.txt','w')
for i in xrange(len(find_author)):
# print i
# print find_content[i]
content = find_content[i].replace("<br/>", " ")
# print content
result1 = find_author[i] + content+find_comment[i]
file.write(result1.encode('utf-8'))
file.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息