python网页数据抓取(前几天遇到一个非计算机行业的同学提了一个怎么办?)
优采云 发布时间: 2021-12-12 19:01python网页数据抓取(前几天遇到一个非计算机行业的同学提了一个怎么办?)
一直在关注网络爬虫,看了很多大牛的文章,感觉网络爬虫是学习python的入门技术。就在几天前,我遇到了一位非计算机行业的同学,他询问了从互联网上获取电子邮件信息的问题。我借此机会尝试了python大法。
先分析需求:学生想获取大量的邮箱地址,但是在国内哪里可以获取大量的邮箱地址呢?我首先想到的是贴吧,所以我决定从贴吧那里获取评论。
然后,通过观察贴吧的结构,我们可以看出贴吧的整体结构还是比较规则的。因此,决定按照以下顺序跟踪一定级别的采集贴吧信息:
首先从某个贴吧首页抓取所有帖子的贴吧链接信息,抓取每个帖子的详细信息
观察某贴吧的主页。最底层是页面导航栏。从源码中可以看到贴吧的总发帖数。从链接中可以看出贴吧是每50个帖子为一页
下一步就是抢首页,匹配贴吧帖子总数
get_Html_Data() 函数获取网页源代码
#抓取首页 调用get_tie()函数获取帖子个数
def get_Html_Data(self, url):
Ex_value = 1.7
userAgent = headerfile.USER_AGENTS
time.sleep(random.uniform(0.5, 1.6))
if url not in self.closetable:
request = urllib2.Request(url)
request.add_header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')
request.add_header('User-Agent', random.choice(userAgent))
proxy_handler = urllib2.ProxyHandler(random.choice(self.readIp()))
urllib2.build_opener(proxy_handler)
response = urllib2.urlopen(request,timeout=5)
if response.geturl() == url:
htmlpage = response.read()
self.get_tie(htmlpage)
return htmlpage
else:
return 0
print '获取网页出错'
else:
print '已获取过该网页'
tie_counter() 函数获取帖子总数
#找出该贴吧共有多少页帖子
def tie_counter(self, myPage):
# 匹配 "尾页" 来获取尾页内容
lastpage = re.search(r'class="th_footer_l">(.*?)个', myPage, re.S)
if lastpage:
lastpage = re.search(r'"red_text">(\d+?)', str(lastpage.group(1)), re.S)
if lastpage :
endPage = int(lastpage.group(1))
# endPage = int(lastpage.group(1))
else:
endPage = 0
print u'log:无法计算该帖吧有多少页!'
return endPage
然后遍历贴吧的所有页面
def main_in(self,url):
htmlpage = self.get_Html_Data(url)
self.tie_page_num = self.tie_counter(htmlpage) / 50
url = url + '&ie=utf-8&pn='
for i in range(1, self.tie_page_num):
in_url = url + str(i*50)
self.get_Html_Data(in_url)
self.Write_into_closetable(in_url)
print in_url
使用get_tie()函数在访问每个页面时匹配帖子ID,并组合成帖子链接放在对列
<p> def get_tie(self,htmlpage):
# 朋友过个招?
print '获取网页'
htmlpage = htmlpage.decode('utf-8')#----------------------------------有问题需要修改(UnicodeDecodeError: 'utf8' codec can't decode bytes in position 151173-151174: invalid continuation by)
tie_nums = re.findall('