零基础写python爬虫之抓取百度贴吧代码分享,python爬虫

日期: 2019-12-15 03:18 浏览次数 :

享受给大家供大家参考,具体如下:Python3落实爬取内定百度贴吧页面并保留页面数据变动当半夏书档案的措施。分享给我们供大家参谋,具体如下:

零基本功写python爬虫之抓取百度贴吧代码分享,python爬虫

这里就不给大家废话了,直接上代码,代码的阐述都在讲授里面,看不懂的也别来问笔者,好好上学基本功知识去!

复制代码 代码如下:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:百度贴吧爬虫
#   版本:0.1
#   作者:why
#   日期:2013-05-14
#   语言:Python 2.7
#零基础写python爬虫之抓取百度贴吧代码分享,python爬虫。   操作:输入带分页的地点,去掉最前面包车型地铁数字,设置一下起初页数和终极页数。
#   效能:下载对应页码内的保有页面并蕴藏为html文件。
#---------------------------------------
import string, urllib2
#概念百度函数
def baidu_tieba(url,begin_page,end_page):  
    for i in range(begin_page, end_page+1):
        sName = string.zfill(i,5) + '.html'#自行填充成八个人的文书名
        print '正在下载第' + str(i卡塔尔 + '个网页,并将其积攒为' + sName + '......'
        f = open(sName,'w+')
        m = urllib2.urlopen(url + str(i)).read()
        f.write(m)
        f.close()
#-------- 在这里地输入参数 ------------------
# 这一个是广西北高校学的百度贴吧中某三个帖子之处
#bdurl = ''
#iPostBegin = 1
#iPostEnd = 10

bdurl = str(raw_input(u'请输入贴吧之处,去掉pn=前面包车型客车数字:n'))
begin_page = int(raw_input(u'请输入开端的页数:n'))
end_page = int(raw_input(u'请输入终点的页数:n'))
#-------- 在那输入参数 ------------------
#调用
baidu_tieba(bdurl,begin_page,end_page)

如上便是python抓取百度贴吧的生龙活虎段轻松的代码,特别的实用吧,各位能够自动扩充下。

一、背景

第后生可畏大家成立三个python文件, tieba.py,大家要做到的是,输入钦点百度贴吧名字与钦命页面范围之后爬取页面html代码,我们率先观望贴吧url的原理,比方:

爬虫程序采用python中的正则怎完成抓取静态网页源码中的id号与id内容

自个儿只看见了ID号,没有见到ID内容啊,在哪儿?
提取ID号的话,正则是ID-d+-d+  

新近全校学园网不知晓是何等景况,总现身掉线的情景。每回掉线都必要自己手动张开web浏览重视新张开账号密码输入,重新展开登陆。系统的主题材料自身不可能撤消,可是足以写三个粗略的python脚本用于机动登入高校网。每一次掉线后,再展开任意网页正是那一个页面。

百度贴吧英雄联盟吧第风度翩翩页:

怎在scrapy框架下,用python完毕爬虫自动跳转页面来抓去网页内容?

爬虫追踪下风流浪漫页的方法是和煦模仿点击下生机勃勃页连接,然后发出新的伸手。请看:
item1 = Item(卡塔尔(英语:State of Qatar)yield item1item2 = Item(卡塔尔(قطر‎yield item2req = Request(url='下意气风发页的链接', callback=self.parse卡塔尔国yield req
注意使用yield时绝不用return语句。

 

这里就不给我们废话了,直接上代码,代码的解说都在讲明里面,看不懂的也别来问...

图片 1

第二页:

二、实今世码

第三页:

#-*- coding:utf-8 -*-
__author__ = 'pf'
import time
import requests
class Login:
 #初始化
 def __init__(self):
  #检测间隔时间,单位为秒
  self.every = 10
 #模拟登录
 def login(self):
  print self.getCurrentTime(), u"拼命连网中..."
  url="http://222.24.19.190:8080/portal/pws?t=li"
  #消息头
  headers={
  'Host':"222.24.19.190:8080",
  'User-Agent':"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0",
  'Accept':"application/json, text/javascript, */*; q=0.01",
  'Accept-Language':"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
  'Accept-Encoding':"gzip, deflate",
  'Referer':"http://222.24.19.190:8080/portal/index_default.jsp",
  'Content-Type':"application/x-www-form-urlencoded",
  'X-Requested-With':"XMLHttpRequest",
  'Content-Length':"291",
  'Connection':"close"
  }
  #提交的信息
  payload={
  'userName':'1403810041',
  'userPwd':'MTk4NDEy',
  'userurl':'http%3A%2F%2Fwww.msn.com%3Focid%3Dwispr&userip=222.24.52.200',
  'portalProxyIP':'222.24.19.190',
  'portalProxyPort':'50200',
  'dcPwdNeedEncrypt':'1',
  'assignIpType':'0',
  'appRootUrl':'=http%3A%2F%2F222.24.19.190%3A8080%2Fportal%2F',
  'manualUrlEncryptKey':'rTCZGLy2wJkfobFEj0JF8A%3D%3D'
  }
  try:
   r=requests.post(url,headers=headers,data=payload)
   print self.getCurrentTime(),u'连上了...现在开始看连接是否正常'
  except:
   print("error")
 #判断当前是否可以连网
 def canConnect(self):
  try:
   q=requests.get("http://www.baidu.com")
   if(q.status_code==200):
    return True
   else:
    return False
  except:
   print 'error'
 #获取当前时间
 def getCurrentTime(self):
  return time.strftime('[%Y-%m-%d %H:%M:%S]',time.localtime(time.time()))
 #主函数
 def main(self):
  print self.getCurrentTime(), u"Hi,欢迎使用自动登陆系统"
  while True:
   self.login()
   while True:
    can_connect = self.canConnect()
    if not can_connect:
     print self.getCurrentTime(),u"断网了..."
     self.login()
    else:
     print self.getCurrentTime(), u"一切正常..."
    time.sleep(self.every)
   time.sleep(self.every)
login = Login()
login.main()

意识规律了啊,贴吧中各种页面不一样之处,就是url最终的pn的值,其他的都以大器晚成致的,我们能够吸引这几个规律(kw表示贴吧名,接受url编码)。

三、化解步骤

略知生机勃勃二了url法规,大家便能够运用urllib展开批量式数据爬取,代码如下:

第朝气蓬勃必要二个用于抓包的工具。大家要抓取提交的数额以至交付到的url地址。小编这里用的是firefox浏览器的httpfox插件。

# -*- coding:utf-8 -*-
from urllib import request as urllib2
from urllib import parse
import random
def loadPage(url, page):
  '''
  根据url获取服务器响应文件
  url:需要爬取的url
  '''
  print('---------正在下载页面%d-------' % page)
  ua_list = [
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
  ]
  header = random.choice(ua_list)
  request = urllib2.Request(url)
  request.add_header('User-Agent', header)
  response = urllib2.urlopen(request)
  html = response.read()
  return html
def write(html, page):
  '''
  将html文件写入本地
  :param html: 服务器响应文件内容
  :return:
  '''
  data = html
  file_name = 'tieba{}.txt'.format(page)
  print('---------正在保存文件%s-------'%file_name)
  # 运用with open as语句使代码更加简洁 避免写异常处理和文件关闭语句
  with open(file_name,'w',encoding='utf-8') as file:
    file.write(data.decode())
  print('---------success!---------')
def tiebaSpider(url, kw, begin, end):
  '''
  爬取贴吧信息
  '''
  words = {
    'kw':kw
  }
  kw = parse.urlencode(words)
  url = url % (kw)
  for page in range(begin, end + 1):
    pn = ((page-1)*50)
    ful_url = url + str(pn)
    html = loadPage(url, page)
    write(html, page)
if __name__ == '__main__':
  kw = input('请输入爬取贴吧名:')
  beginPage = int(input('请输入起始页:'))
  endPage = int(input('请输入结束页:'))
  url = r'http://tieba.baidu.com/f?%s&pn='
  tiebaSpider(url, kw, beginPage, endPage)

图片 2