Python实现抓取百度搜索结果页的网站标题信息,python抓取

by admin on 2019年9月5日

威澳门尼斯人1294cc 1
Title:Python抓取百度音乐

百度音乐API抓取

前段时间做了一个本地音乐的播放器 github地址,想实现在线播放的功能,于是到处寻找API,很遗憾,不是歌曲不全就是质量不高。在网上发现这么一个APIMRASONG博客,有“获取榜单,搜索歌词,下载地址,专辑”信息等等接口。

后来发现有些接口使用起来不是很方便,比如获取专辑信息,只能得到歌曲列表的id信息,所以自己决定用fiddler来对百度音乐安卓客户端抓包。

下面是一系列的接口:

该demo以“百度百科”为关键字,抓取百科第一页搜索结果内容及其百科内容,并保存html
和 text 文件。

Python抓取百度查询结果的方法,python抓取查询结果

本文实例讲述了Python抓取百度查询结果的方法。分享给大家供大家参考。具体实现方法如下:

#win python 2.7.x
import re,sys,urllib,codecs
xh = urllib.urlopen("http://www.baidu.com/s?q1=123&rn=100").read().decode('utf-8') 
rc = re.compile(r'<td class=f><h3 class="t"><a.*?>(?P<first>.*?)</h3>',re.I)
match = rc.finditer(xh)
rcr = re.compile(r'<[^>]+>',re.I)
f = codecs.open("xiaohei.txt", "w", "utf-8")
for i in rc.finditer(xh):
  ss = i.group(0)
  s1 = rcr.sub('',ss)
  print (s1)
  f.write(s1)
f.close()

希望本文所述对大家的Python程序设计有所帮助。

本文实例讲述了Python抓取百度查询结果的方法。分享给大家供大家参考。具体实现方法如…

Python实现抓取百度搜索结果页的网站标题信息,python抓取

威澳门尼斯人1294cc 2

比如,你想采集标题中包含“58同城”的SERP结果,并过滤包含有“北京”或“厦门”等结果数据。

该Python脚本主要是实现以上功能。

其中,使用BeautifulSoup来解析HTML,可以参考我的另外一篇文章:Windows8下安装BeautifulSoup

代码如下:

复制代码 代码如下:

__author__ = ‘曾是土木人’
# -*- coding: utf-8 -*-
#采集SERP搜索结果标题
import urllib2
from bs4 import BeautifulSoup
import time
#写文件
def WriteFile(fileName,content):
    try:
        fp = file(fileName,”a+”)
        fp.write(content + “\r”)
        fp.close()
    except:
        pass

#获取Html源码
def GetHtml(url):
    try:
        req = urllib2.Request(url)
        response= urllib2.urlopen(req,None,3)#设置超时时间
        data    = response.read().decode(‘utf-8′,’ignore’)
    except:pass
    return data

#提取搜索结果SERP的标题
def FetchTitle(html):
    try:
        soup = BeautifulSoup(”.join(html))
        for i in soup.findAll(“h3”):
            title = i.text.encode(“utf-8”)      
       if any(str_ in title for str_ in (“北京”,”厦门”)):
          continue
            else:
                print title
            WriteFile(“Result.txt”,title)
    except:
        pass

keyword = “58同城”
if __name__ == “__main__”:
    global keyword
    start = time.time()
    for i in range(0,8):
        url =
“)
        html = GetHtml(url)
        FetchTitle(html)
        time.sleep(1)
    c = time.time() – start
    print(‘程序运行耗时:%0.2f 秒’%(c))

比如,你想采集标题中包含“58同城”的SERP结果,并过滤包含有“北京”或“厦门…

Author:Insun

一. 关键词建议:

GET:

 http://tingapi.ting.baidu.com/v1/restserver/ting?from=android&version=5.6.5.0&method=baidu.ting.search.catalogSug&format=json&query=%E4%B8%83%E9%87%8C%E9%A6%99

参数:

version   5.6.5.0    //版本
query   七里香//关键字
method  baidu.ting.search.catalogSug//method
fromandroid    //平台
formatjson   //format格式

威澳门尼斯人1294cc,返回:

{
  "song": [
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "周杰伦",
  "control": "0000000000",
  "songid": "15702101",
  "has_mv": "1",
  "encrypted_songid": "0806ef98550855dddac0"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香(live版)",
  "artistname": "周杰伦",
  "control": "0000000000",
  "songid": "18638327",
  "has_mv": "0",
  "encrypted_songid": "920711c65f70855e5be03"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "周玥178",
  "control": "0000000000",
  "songid": "121794230",
  "has_mv": "0",
  "encrypted_songid": ""
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "刘芳",
  "control": "0000000000",
  "songid": "2077664",
  "has_mv": "0",
  "encrypted_songid": "50061fb3e00854ce60db"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "网络歌手",
  "control": "0000000000",
  "songid": "28216714",
  "has_mv": "0",
  "encrypted_songid": "31071ae8d8a0854cc129e"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香(Live)",
  "artistname": "周杰伦",
  "control": "0000000000",
  "songid": "51981196",
  "has_mv": "0",
  "encrypted_songid": "58073192b8c0855ddd8da"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "汪东城",
  "control": "0000000000",
  "songid": "84961907",
  "has_mv": "0",
  "encrypted_songid": "08075106a730854cdd805"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "施艾敏",
  "control": "0000000000",
  "songid": "17565909",
  "has_mv": "0",
  "encrypted_songid": "420710c08d508559df21f"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "苏仨",
  "control": "0000000000",
  "songid": "84957626",
  "has_mv": "0",
  "encrypted_songid": "830751059ba08559df358"
},
{
  "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
  "yyr_artist": "0",
  "songname": "七里香",
  "artistname": "陈淑桦",
  "control": "0000000000",
  "songid": "208828",
  "has_mv": "0",
  "encrypted_songid": "370532fbc0855e3ed63"
}
  ],
  "order": "song,album",
  "error_code": 

** 准备工作

Content:

打开[百度百科](http://baike.baidu.com
title=’baike’),
输入关键字“百度百科”,点击“搜索词条”按钮,在地址栏可找到搜索url:
http://baike.baidu.com/search?word=百度百科&pn=0&rn=0&enc=utf8。由于关键字含有中文,有的word参数可能会进行url编码,后面我们会对此进行url解码。

打开开发者工具,查看源文件, 在97行可以找到如下源码,
<a class="result-title" href="http://baike.baidu.com/view/1.htm" target="_blank"><em>百度</em><em>百科</em>_百度百科</a>
其中href后面的地址就是对应词条的url。<a>标签之间的就是搜索到的词条,当然我们要把没用的html标签给replace掉。

可以根据歌手名称来搜他的音乐 

** 正式开始

譬如搜陈奕迅 有1161首歌曲 

  1. 新建文件

 urlencode。

在工作目录下创建baike/baike.py文件

正则匹配一个页面上所有的歌名,一个分页20个。(这里就没去抓其他分页了)

  1. 文件编码

然后根据一个百度音乐老接口API ,现在的音乐盒域名是play.baidu.com

从搜索词条的url中enc参数可知,我们请求的文件编码格式为“utf8”,
所以我们文件格式也指定为“utf8”.
参考 Defining Python Source Code
Encodings

威澳门尼斯人1294cc 3

  1. 定义变量

<count>5</count>

威澳门尼斯人1294cc 4

keyword:关键字
searchUrl: 搜索的url地址
quote(): url编码,需要导入urllib2库

<url>

  1. 抓取源文件

<encode>

威澳门尼斯人1294cc 5

使用urllib2库抓取源文件

  1. 保存html文件

/ZGVsZ2tsamxfn6NndK6ap5WXcGeba5lsZ2qXmGlunZ1ilmqVmGuammFjlWxsamtrYmeWWqKfm3VhYGhqamxsaWFlZ2RtanBuMQ$$

威澳门尼斯人1294cc 6

如果目录不存在,首先创建目录。
为了解决中文乱码问题,我们使用codecs库创建一个utf8格式的文件,把html内容写入文件时,也使用utf8编码,这样就不会乱码了(中文乱码搞了好久)。
open(), write(), close() 三步完活。
最后一个参数mode默认指定文件写的权限(‘w’),
后面还会使用追加(‘a’)模式。

</encode>

  1. 解析html

<decode>33936634.mp3?xcode=3f5b468dd48fe1d7ac5cb01b8744315c&mid=0.56565103408496

威澳门尼斯人1294cc 7

我们使用正则(re)模块解析下载下来的html。找到搜索到的关键词的title,
url, summary,写入文件。
trimHtml()
去除提取到内容中的嵌套标签。这个函数有个缺陷就是只能处理单行,如果标签跨越多行,就无法处理。

</decode>

  1. 主要逻辑

<type>8</type>

威澳门尼斯人1294cc 8

主要流程:查找url -> 抓取源文件 -> 保存html文件 ->
按行解析html -> 保存txt文件 -> 抓取搜索到的关键词源文件 ->
保存html文件 -> 解析html -> 保存txt文件

<lrcid>2399</lrcid>

  1. 源码

<flag>1</flag>

</url>

#! /usr/bin/python
# -*- coding: utf8 -*-
import urllib2
import re
import os
import codecs 
def fetchSourceCode(url):
        response = urllib2.urlopen(url)
        return response.read()
def saveFile(path, filename, content, mode='w'):
        path = path.decode('utf8')
        filename = filename.decode('utf8')

        if not os.path.exists(path):
                os.makedirs(path)
        fd = codecs.open(path + "/" + filename, mode, 'utf8')
        fd.write(content.decode('utf8'))
        fd.close()
def matchResultTitle(line):
        match = re.match(r'.*?<a class="result-title" href="(.*?)" target="_blank">(.*?百度百科.*?)</a>.*', line)
        if match:
                return match.group(1), trimHtml(match.group(2))
        return None, None
def matchSummary(line):
        match = re.match(r'.*?<p class="result-summary">(.*?)</p>.*', line)
        if match:
                return trimHtml(match.group(1))
        return None
def findBodyContent(html):
        results = re.findall(r'<dd class="lemmaWgt-lemmaTitle-title">(.*?)</body>', html, re.S)
        if len(results) > 0:
                return trimHtml(results[0])
        return None
def trimHtml(text):
        return re.sub(r'<.*?>', '', text)
keyword = '百度百科'
searchUrl = 'http://baike.baidu.com/search?word=' + urllib2.quote('百度百科') + '&pn=0&rn=0&enc=utf8'
html = fetchSourceCode(searchUrl)
saveFile('baike', keyword + '.html', html)
saveFile('baike', keyword + '.txt', '')
lines = html.split('\n')
for line in lines:
        url, title = matchResultTitle(line)
        if url:
                saveFile('baike', keyword + '.txt', title + '\n' + url + '\n\n', mode='a')
                summary = matchSummary(line)
                if summary:
                        saveFile('baike', keyword + '.txt', summary + '\n\n', mode='a')
                # save sub html
                subHtml = fetchSourceCode(url)
                saveFile('baike/' + keyword, title + '.html', subHtml)
                bodyContent = findBodyContent(subHtml)
                saveFile('baike/' + keyword, title + '.txt', bodyContent)

 

XML文件 count是说有5个可以下载的资源

我们直接取第一个

encode加密的链接是

 

/ZGVsZ2tsamxfn6NndK6ap5WXcGeba5lsZ2qXmGlunZ1ilmqVmGuammFjlWxsamtrYmeWWqKfm3VhYGhqamxsaWFlZ2RtanBuMQ$$

 

红色部分就是下面decode的内容

<decode>33936634.mp3?xcode=3f5b468dd48fe1d7ac5cb01b8744315c&mid=0.56565103408496

 

</decode>

 

我们python字符串处理一下 根据最后一个“/”来截取 最后拼凑成

33936634.mp3?xcode=3f5b468dd48fe1d7ac5cb01b8744315c&mid=0.56565103408496

 

<?xml version=”1.0″ encoding=”gb2312″ ?>

<result><count>5</count><url>

<encode>

<![CDATA[

ZGVsZ2tsamxfn6NndK6ap5WXcGeba5lsZ2qXmGlunZ1ilmqVmGuammFjlWxsamtrYmeWWqKfm3VhYGhqamxsaWFlZ2RtanBuMQ$$]]>

</encode>

<decode>

<![CDATA[33936634.mp3?xcode=3f5b468dd48fe1d7ac5cb01b8744315c&mid=0.56565103408496]]>

</decode><type>8</type><lrcid>2399</lrcid><flag>1</flag></url>

<durl>

<encode>

<![CDATA[

YmpjZmpmbmaeomZzrZmmnJZvZppqmGtuaZaXaG2cnGmVaZSXapmZaGKUa2tpamppZpVZoZ6adGhfZ2lpa2toaGRmY2xpb204]]>

</encode><decode><![CDATA[1802507.mp3?xcode=3f5b468dd48fe1d7ac5cb01b8744315c&mid=0.56565103408496]]>

</decode><type>8</type><lrcid>2399</lrcid><flag>1</flag></durl>

威澳门尼斯人1294cc 9

 

 源代码里是有CDATA的 所有正则时候要处理一下

type是类型 是mp3呢还是wma呢还是rm呢。。等等。。

lrcid 是个取整的算法 除以一百,然后取小于等于其结果的最大整数  2399/100 =
23

然后分songs和lrcs目录下载下来

#!/usr/bin/env python

#! -*- encoding:utf-8 -*-

”’

根据歌手去找歌曲 一页20首歌 

然后根据歌名和歌手来下载歌曲和歌词

20首歌和歌词 接近1M/s的网速 花了33.9479383463s

author:insun

”’

import urllib,re,sys,os,time

reload(sys)

sys.setdefaultencoding(‘utf-8’)

 

def musicScapy(singername):

    query =  urllib.quote(singername)

    url = ‘

    response = urllib.urlopen(url)

    text = response.read()

    #<span class=”song-title”  style=”width: 170px;” ><a
href=”/song/7316463″ class=”” data-songdata='{ “id”: “” }’
title=”爱情转移”>爱情转移</a>

    reg = re.compile(r'<span
class=”song-title”.+?>.+?<a.+?>(.*?)</a>’,re.S)

    groups = re.findall(reg,text)

    ”’判断目录songs和lrcs是否存在,不存在创建。否则报错”’

    if (os.path.exists(‘songs’)== False):

        os.mkdir(‘songs’)

    if(os.path.exists(‘lrcs’) == False):

        os.mkdir(‘lrcs’)

 

    for musicname in groups:

        try:

            xml =
 urllib.urlopen(”

                   + musicname+’$$’+singername +’$$’).read()  

            encode =
 re.compile(‘<encode>.*?CDATA\[(.*?)\]].*?</encode>’,re.S).findall(xml)[0]
 

            decode =
 re.compile(‘<decode>.*?CDATA\[(.*?)\]].*?</decode>’,re.S).findall(xml)[0]
 

            lrcid =
 re.compile(‘<lrcid>(.*?)</lrcid>’,re.S).findall(xml)[0]

            #encode.rindex(‘/’) 最后出现’/’的位置

            

            musicname = musicname.decode(‘utf-8’)

            musiclink = encode[:encode.rindex(‘/’)+1] + decode

            lrclink =

            #song download

            urllib.urlretrieve(musiclink,’songs/’+ musicname+’.mp3′)

            #lrc download

            urllib.urlretrieve(lrclink,’lrcs/’+ musicname+’.lrc’)

        

        except BaseException:

            print ‘download failed’

            continue  

            

if __name__ == ‘__main__’:

    beginTime = time.clock()

    musicScapy(‘陈奕迅’)

    endTime = time.clock()

    print endTime-beginTime

 

 

 

用gevent的话花了37.5646471024s 肯定大批量数据 gevent比较给力吧

 

Author:Insun Content:
可以根据歌手名称来搜他的音乐 譬如搜陈奕迅 有1161首歌曲

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图