python网页数据抓取(前几天遇到一个非计算机行业的同学提了一个怎么办?)

优采云 发布时间: 2021-12-12 19:01

  python网页数据抓取(前几天遇到一个非计算机行业的同学提了一个怎么办?)

  一直在关注网络爬虫,看了很多大牛的文章,感觉网络爬虫是学习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 &#39;获取网页&#39;

htmlpage = htmlpage.decode(&#39;utf-8&#39;)#----------------------------------有问题需要修改(UnicodeDecodeError: &#39;utf8&#39; codec can&#39;t decode bytes in position 151173-151174: invalid continuation by)

tie_nums = re.findall(&#39;

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线