爬取贴吧页面

Get方式

GET请求一般用于我们向服务器获取数据,比如说,我们用百度搜索传智播客https://www.baidu.com/s?wd=传智播客

浏览器的url会跳转成如图所示:

https://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2

在其中我们可以看到在请求部分里,http://www.baidu.com/s? 之后出现一个长长的字符串,其中就包含我们要查询的关键词传智播客,于是我们可以尝试用默认的Get方式来发送请求。

from urllib import request, parse    # parse负责url编码处理

url = "http://www.baidu.com/s"
word = {"wd":"传智播客"}
word = parse.urlencode(word)  #转换成url编码格式(字符串)
newurl = url + "?" + word    # url首个分隔符就是 ?

headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

req = request.Request(newurl, headers=headers)

response = request.urlopen(req)

print(response.read())

批量爬取贴吧页面数据

首先我们创建一个python文件, tiebaSpider.py,我们要完成的是,输入一个百度贴吧的地址,比如:

百度贴吧LOL吧第一页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

第二页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

第三页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

发现规律了吧,贴吧中每个页面不同之处,就是url最后的pn的值,其余的都是一样的,我们可以抓住这个规律。

简单写一个小爬虫程序,来爬取百度LOL吧的所有网页。
  • 先写一个main,提示用户输入要爬取的贴吧名,并用 urllib.parse.urlencode()进行转码,然后组合url,假设是lol吧,那么组合后的url就是:http://tieba.baidu.com/f?kw=lol
# 模拟 main 函数
if __name__ == "__main__":

    kw = input("请输入需要爬取的贴吧:")
    # 输入起始页和终止页,str转成int类型
    beginPage = int(input("请输入起始页:"))
    endPage = int(input("请输入终止页:"))

    url = "http://tieba.baidu.com/f?"
    key = urllib.parse.urlencode({"kw" : kw})

    # 组合后的url示例:http://tieba.baidu.com/f?kw=lol
    url = url + key
    tiebaSpider(url, beginPage, endPage)
  • 接下来,我们写一个百度贴吧爬虫接口,我们需要传递3个参数给这个接口, 一个是main里组合的url地址,以及起始页码和终止页码,表示要爬取页码的范围。
def tiebaSpider(url, beginPage, endPage):
    """
        作用:负责处理url,分配每个url去发送请求
        url:需要处理的第一个url
        beginPage: 爬虫执行的起始页面
        endPage: 爬虫执行的截止页面
    """

    for page in range(beginPage, endPage + 1):
        pn = (page - 1) * 50

        filename = "第" + str(page) + "页.html"
        # 组合为完整的 url,并且pn值每次增加50
        fullurl = url + "&pn=" + str(pn)
        #print(fullurl)

        # 调用loadPage()发送请求获取HTML页面
        html = loadPage(fullurl, filename)
        # 将获取到的HTML页面写入本地磁盘文件
        writeFile(html, filename)
  • 我们已经之前写出一个爬取一个网页的代码。现在,我们可以将它封装成一个小函数loadPage,供我们使用。
def loadPage(url, filename):
    ‘‘‘
        作用:根据url发送请求,获取服务器响应文件
        url:需要爬取的url地址
        filename: 文件名
    ‘‘‘
    print("正在下载" + filename)

    headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}

    req = urllibrequest.Request(url, headers = headers)
    response = request.urlopen(req)
    return response.read()
  • 最后如果我们希望将爬取到了每页的信息存储在本地磁盘上,我们可以简单写一个存储文件的接口。
def writeFile(html, filename):
    """
        作用:保存服务器响应文件到本地磁盘文件里
        html: 服务器响应文件
        filename: 本地磁盘文件名
    """
    print "正在存储" + filename
    with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
        f.write(html)
    print "-" * 20

完整代码:

from urllib import request, parse
import sys

def loadPage(url, filename):
    """
    作用: 根据url发送请求, 获取服务器相应文件
    url: 需要爬取的url地址
    """
    print("正在下载" + filename)
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
    }
    req = request.Request(url, headers=headers)
    # 获得系统的编码
    type = sys.getfilesystemencoding()
    # 设置爬出内容的编码
    print(type)
    # ************************************************
    html = request.urlopen(req).read().decode(type)
    # ************************************************
    print(html)
    return html

def writePage(html, filename):
    """
    作用: 将html内容写入到本地
    html: 服务器相应文件内容
    """
    print("正在保存" + filename)
    # ***********************************************
    with open(filename, "w", encoding="utf-8") as f:
        # ***********************************************
        f.write(html)
    print("*" * 30)

def tiebaSpider(url, bingenPage, endPage):
    """
    作用: 爬虫爬虫调度器, 负责组合处理每一个页面的url
    url: 贴吧url的前部分,
    beginPage: 起始页
    endPage: 终止页
    """
    for page in range(beginPage, endPage + 1):
        pn = (page - 1) * 50
        filename = " 第" + str(page) + "页.html"
        fullurl = url + "&pn=" + str(pn)
        print(fullurl)
        html = loadPage(fullurl, filename)
        writePage(html, filename)

if __name__ == "__main__":
    kw = input("请输入需要爬取的贴吧名:")
    beginPage = int(input("请输入起始页编号"))
    endPage = int(input("请输入结束页编号:"))
    url = "http://tieba.baidu.com/f?"
    key = parse.urlencode({"kw": kw})
    fullurl = url + key
    tiebaSpider(fullurl, beginPage, endPage)

其实很多网站都是这样的,同类网站下的html页面编号,分别对应网址后的网页序号,只要发现规律就可以批量爬取页面了。

原文地址:https://www.cnblogs.com/amou/p/9131495.html

时间: 2024-11-06 12:29:51

爬取贴吧页面的相关文章

Python 2.7_爬取CSDN单页面利用正则提取博客文章及url_20170113

年前有点忙,没来的及更博,最近看爬虫正则的部分 巩固下 1.爬取的单页面:http://blog.csdn.net/column/details/why-bug.html 2.过程 解析url获得网站源代码 3.找到文章标题列表和文章url(a标签下'href'属性)组成列表 4.for循环取出 #解析用到的还是urlllib urllib2两个模块 并加了个header请求表头 代码及过程如下: #coding:utf-8 import re import urllib import urll

爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二)

先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 不多说,直接上代码. 编写代码 运行 <!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=Edge" /><meta http-equiv="Content-Type" content="text/html; c

Python开发简单爬虫(二)---爬取百度百科页面数据

一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格式, 比如文本数据为div class="xxx", ③ 容易看到编码为utf-8 2.分析目标 目标: 百度百科python词条 入口页: http://baike.baidu.com/item/Python词条页面url格式:/item/**** 数据格式: 标题: <dd cl

Scrapy爬取简单百度页面

Scrapy爬取百度页面 ------------------------------------------ spiders-baiduspider.py 1 ''' 2 要求导入scrapy 3 所有类一般是XXXSpider命名 4 所有爬虫类是scrapy.Spider的子类 5 scrapy爬取百度 6 关闭配置的机器人协议 7 ''' 8 9 import scrapy 10 11 class BaiduSpider(scrapy.Spider): 12 13 # name是爬虫的名

交作业啊,python爬取58的页面

第一次写博文,好紧张啊,写这么烂怎么给别人看啊先做下总结: 刚开始学习python,自我感觉python写起来确实很方便,各种库,各种语法糖,不过刚接触,一下子记不下来这么多东西,总感觉乱乱的,用的多了熟悉之后应该就好了吧 这次作业基本完成了作业的要求,但是由于是在上班期间抽时间写的,可能有些乱.个人感觉这次作业的难度不大,唯一麻烦的地方就是找浏览量接口, 一开始我以为58会把浏览量的值直接发过来,通过选择器直接去修改页面的值,于是试了各种选择方式去js代码里搜,结果搜了半天也没找到,最后只好通

爬虫框架Scrapy入门——爬取acg12某页面

1.安装1.1自行安装python3环境1.2ide使用pycharm1.3安装scrapy框架2.入门案例2.1新建项目工程2.2配置settings文件2.3新建爬虫app新建app将start_urls的值修改为需要爬取的第一个url修改parse()方法然后运行一下看看,在mySpider目录下执行: 1.安装 1.1自行安装python3环境 1.2ide使用pycharm 1.3安装scrapy框架 pip install twisted pip install lxml pip i

shell脚本——爬取域名一级页面元素并判断其可缓存性

来了一个域名如何判断其缓存与否,高大上的专业爬虫当然可以做分析,如果不是很严谨的分析,通过shell脚本也可以实现,来看看我这个一层页面的小爬吧,哈哈哈,先脚本执行后的结果图: 在处理的时候,会用elinks把页面上所有的元素爬出来,并做统计,用curl探测头信息,通过cache-control头来做判断是否可缓存,如果一个域名下超过70%的url可缓存,那么我就简单认为这个host是可以缓存的,虽然比较粗糙,但是做一个粗略的参考和学习应该足够. 脚本程序如下: #/bin/sh #### 分析

selenium爬取优酷页面并下载图片

1 from selenium import webdriver 2 import requests 3 driver = webdriver.Chrome() 4 #打开优酷 5 driver.get("http://www.youku.com") 6 #点开优酷片库 7 driver.find_element_by_xpath("//*[@id='m_2544']/div/ul/li[6]/span[1]/a").click() 8 #获取所有img元素 9 l

python 发包爬取中国移动充值页面---可判断手机号是否异常

1.用requests.Session()的方式,可以实现自动化管理cookie.session等. 2.具体流程可以抓包分析. 所有请求的参数如要搞清楚需要分析js源码.只能提示一下,一共分为三步: 第一步:get方式获取 prov_cd(地区编号): 第二步:url为动态的(传入手机号和第一步获取的prov_cd)post发送json数据的方式获取salecode.activityNO.operateID.          json中的手机号需要 base64.b64encode(phon