Beautifulsoup

你本无意穿堂风,偏偏孤倨引山洪。


Beautifulsoup的介绍

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

Beautifulsoup的安装

easy_install Beautifulsoup4

我其实不是讲怎么使用Beautifulsoup,而是分享一个Beautifulsoup与requests模块结合使用的例子,以及加入多线程。

c0de

#!/usr/bin/env python
# -*- coding:utf8 -*-
import requests
import urllib.request
import queue
from bs4 import BeautifulSoup
import threading


class Mm(threading.Thread):
    def __init__(self, qq):
        threading.Thread.__init__(self)
        self._qq = qq

    def run(self):
        while not self._qq.empty():
            url = self._qq.get_nowait()
            self.spider(url)

    def spider(self, url):
        r = requests.get(url=url)
        recv = BeautifulSoup(r.content.decode(), 'lxml')
        back = recv.find_all(name='img', attrs={})
        for img in back:
            if 'src' in str(img):
                # 调试用 print(img['src'])
                urllib.request.urlretrieve('http:'+img['src'], 'C:/Users/yangt/Desktop/python/mm/'+img['src'].split('/')[-1])


def main():
    qq = queue.Queue()
    for i in range(1, 250):
        qq.put('http://jandan.net/ooxx/page-' + str(i))
    threads = []
    # 设置线程数
    thread_counts = 8
    for i in range(thread_counts):
        threads.append(Mm(qq))
    for i in threads:
        i.start()
    for i in threads:
        i.join()

if __name__ == '__main__':
    s = '''
    像我这么碌碌无为的人,你还见过多少人?
                                    BY Wing
    '''
    print(s)
    main()

大概过程

爬虫在我看来,是要先去分析网页的结构,然后才能构造代码,Beautifulsoup在我看来最大的好处就是能够快速准确地分析网页中的数据,并提取出来。在运用多线程的时候为了避免不同步的问题,可以加入queue(队列)来实现线程间的同步。

调用了requests、urllib.request、BeautifulSoup、threading这五个模块,reuests模块获得返回的html页面,beautifulsoup模块对数据进行抽取,我使用的是一个常用的方法。

recv = BeautifulSoup(r.content.decode(), 'lxml')
back = recv.find_all(name='img', attrs={})

意思就是把所有与img标签的内容提取出来。
提取出来的内容类似于

<img src="//wx1.sinaimg.cn/mw600/852a13f1ly1fih2mvox41j20i20r3dmr.jpg" style="max-width: 480px; max-height: 750px;">

我们想要的是

//wx1.sinaimg.cn/mw600/852a13f1ly1fih2mvox41j20i20r3dmr.jpg

因此进行了一个判断提取出这段内容

for img in back:
            if 'src' in str(img):

提取出来之后,就是下载图片的步骤,我使用的撕python3,urllib的用法或许和2有所不同

 urllib.request.urlretrieve('http:'+img['src'], 'C:/Users/yangt/Desktop/python/mm/'+img['src'].split('/')[-1])

前面是下载的地址,后面是保存的路径加上文件名

总共200多页,都将他们加入到队列中,再写一个类继承多线程的方法,重写run方法,在里面调用spider方法,翻页的问题我采用字符串拼接,我只是粗略描述一下过程,想详细接触的朋友请看下面的官方文档。

Beautiful Soup 4.2.0 文档
requests
python多线程


   转载规则


《Beautifulsoup》 Wing 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
url采集脚本(持续更新) url采集脚本(持续更新)
一句话,一个人。一首诗,一段情。 第一次写url采集,针对的是360搜索引擎,谷歌的比较准确,但是只有20页左右,其他搜索引擎是64页左右,我的想法是集齐各个搜索引擎,得到的是这几个搜索引擎的结果,然后去重。完善中… code #!
2017-08-14
下一篇 
联合查询小记 联合查询小记
假如明天你要来,我现在就已经开始期待! 今天对联合查询有一点小问题,具体就是union select 后面加1,2,3,4,5后,为什么页面中会回显2,5这种数字,当我解决了之后发现这个问题挺二的。 union查询的特点就是字段要对
2017-08-07
  目录