文档章节

多线程 爬取 趣图网

 阿豪boy
发布于 2017/08/31 08:55
字数 1292
阅读 32
收藏 0

 

# coding=utf-8

import urllib
import urllib2
import urlparse
import re
import bs4
import requests
import cookielib
from lxml import etree
from bs4 import BeautifulSoup
import os
import sys
import ssl
import threading
import time

reload(sys)
sys.setdefaultencoding('utf-8')

url = 'https://www.doutula.com/article/list/?page=2'
hdr = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8',
    'Connection': 'keep-alive',
    'Referer': 'http://www.baidu.com',
    'Upgrade-Insecure-Requests': '1',
    # 'Host': 'www.doutula.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
}

c = cookielib.LWPCookieJar()
cookie = urllib2.HTTPCookieProcessor(c)
# 附带cookie提交
opener = urllib2.build_opener(cookie)


# 获取 url 的页面的html代码
def getHtml(url):
    request = urllib2.Request(url, headers=hdr)
    response = opener.open(request)
    text = response.read()
    return text


'''
获取网页的 所有 图片组的链接
输入https://www.doutula.com/article/list/?page=2
返回
https://www.doutula.com/article/detail/1923030 
'''


def get_img_url(url):
    html = getHtml(url)
    soup = BeautifulSoup(html, 'lxml')
    # 找所有的图片组a标签
    all_a = soup.find_all('a', class_='list-group-item random_list')
    '''
             <a href="https://www.doutula.com/article/detail/6424222" class="list-group-item random_list"
            <div class="random_title">我们是谁?(程序员版本)<div class="date">2017-08-19</div></div>
    '''
    # all_a是图片的链接

    all_img_url = []
    for a in all_a:
        # a['href'] : https://www.doutula.com/article/detail/2904682
        all_img_url.append(a['href'])
    return all_img_url


# 给一个  https://www.doutula.com/article/detail/2904682
# 保存为文件夹和图片的格式
def save_img(url):
    html = getHtml(url)
    '''
    <div class="artile_des">
    <table>
    <tbody>
    <tr>
    <td>
    <a href="https://www.doutula.com/photo/8759971">
    <img src="//ws2.sinaimg.cn/large/9150e4e5ly1fio901ka7jj20c80c8glz.jpg"
    alt="我敬往事一杯酒,当初眼瞎爱过狗"
    '''
    soup = BeautifulSoup(html, 'html.parser')
    ''' 获取标题,也是文件夹名称
    <li class="list-group-item">     
    <div class="pic-title">
    <h1><a href="https://www.doutula.com/article/detail/2904682">敬你一杯</a></h1>
    '''
    title = soup.select('li.list-group-item > div.pic-title > h1 > a')[0].get_text()

    # 所有图片的链接
    all_img_urls = []
    img_srcs = soup.select("div.artile_des > table > tbody > tr > td > a > img")
    for i in img_srcs:
        all_img_urls.append('https:' + i['src'])

    if not os.path.exists('imgs/' + title):
        os.makedirs('imgs/' + title)

    # 保证图片顺序
    img_num = 0
    for i in all_img_urls:
        # 文件名称
        name = '%d_' % img_num + i.split('/')[-1]
        path = 'imgs/' + title + '/' + name
        print path
        with open(path, 'wb') as f:
            f.write(getHtml(i))
        img_num += 1


'''
给url = 'https://www.doutula.com/article/list/?page=2'
保存所有网页的图片组到文件夹
'''


def save_page_imgs(url):
    img_urls = get_img_url(url)
    for i in img_urls:
        print i
        save_img(i)


url = 'https://www.doutula.com/article/detail/6424222'


# save_img(url)

# cnt = 0
# for i in range(2, 100):
#     try:
#         url = 'https://www.doutula.com/article/list/?page=%d' % i
#         save_page_imgs(url)
#     except Exception, e:
#         print(e)
#
# print cnt

class Craw(threading.Thread):
    def __init__(self, id, urls):
        threading.Thread.__init__(self)
        self.urls = urls
        self.id = id

    def run(self):
        for i in self.urls:
            try:
                print '爬虫 %d 正在爬取 %s' % (self.id, i)
                save_page_imgs(i)
            except Exception,e:
                print e

url_group = []

# 2到181 个页面
for i in range(2, 20):
    urls = []
    for j in range(10):
        url = 'https://www.doutula.com/article/list/?page=%s' % str((i - 2) * 10 + j + 2)
        urls.append(url)
    url_group.append(urls)

cnt = 0
for urls in url_group:
    craw = Craw(cnt, urls)
    craw.start()
    cnt += 1

 

 

使用python3 去掉错误文件

import os

path = r'D:\code\py\py27\爬取斗图网\imgs'

lists = os.listdir(path)

print(len(lists))


def remove_dir(path):
    if os.path.isfile(path ):
        os.remove(path)
    else:
        files = os.listdir(path)
        for i in files:
            remove_dir(path+'//'+i)
        os.removedirs(path)


for i in lists:
    print(i)
    p = path + '\\' + i
    print(p)
    t = os.listdir(p)
    print(len(t))
    if len(t) <= 2:
        remove_dir(p)

 

 

多进程版

# coding=utf-8

import urllib
import urllib2
import urlparse
import re
import bs4
import requests
import cookielib
from lxml import etree
from bs4 import BeautifulSoup
import os
import sys
import ssl
import threading
import time

reload(sys)
sys.setdefaultencoding('utf-8')

url = 'https://www.doutula.com/article/list/?page=2'
hdr = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8',
    'Connection': 'keep-alive',
    'Referer': 'http://www.baidu.com',
    'Upgrade-Insecure-Requests': '1',
    # 'Host': 'www.doutula.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
}

c = cookielib.LWPCookieJar()
cookie = urllib2.HTTPCookieProcessor(c)
# 附带cookie提交
opener = urllib2.build_opener(cookie)


# 获取 url 的页面的html代码
def getHtml(url):
    request = urllib2.Request(url, headers=hdr)
    response = opener.open(request)
    text = response.read()
    return text


'''
获取网页的 所有 图片组的链接
输入https://www.doutula.com/article/list/?page=2
返回
https://www.doutula.com/article/detail/1923030 
'''


def get_img_url(url):
    html = getHtml(url)
    soup = BeautifulSoup(html, 'lxml')
    # 找所有的图片组a标签
    all_a = soup.find_all('a', class_='list-group-item random_list')
    '''
             <a href="https://www.doutula.com/article/detail/6424222" class="list-group-item random_list"
            <div class="random_title">我们是谁?(程序员版本)<div class="date">2017-08-19</div></div>
    '''
    # all_a是图片的链接

    all_img_url = []
    for a in all_a:
        # a['href'] : https://www.doutula.com/article/detail/2904682
        all_img_url.append(a['href'])
    return all_img_url


# 给一个  https://www.doutula.com/article/detail/2904682
# 保存为文件夹和图片的格式
def save_img(url):
    html = getHtml(url)
    '''
    <div class="artile_des">
    <table>
    <tbody>
    <tr>
    <td>
    <a href="https://www.doutula.com/photo/8759971">
    <img src="//ws2.sinaimg.cn/large/9150e4e5ly1fio901ka7jj20c80c8glz.jpg"
    alt="我敬往事一杯酒,当初眼瞎爱过狗"
    '''
    soup = BeautifulSoup(html, 'html.parser')
    ''' 获取标题,也是文件夹名称
    <li class="list-group-item">     
    <div class="pic-title">
    <h1><a href="https://www.doutula.com/article/detail/2904682">敬你一杯</a></h1>
    '''
    title = soup.select('li.list-group-item > div.pic-title > h1 > a')[0] \
        .get_text().strip()

    # 所有图片的链接
    all_img_urls = []
    img_srcs = soup.select("div.artile_des > table > tbody > tr > td > a > img")
    for i in img_srcs:
        all_img_urls.append('https:' + i['src'])

    if not os.path.exists('imgs/' + title):
        os.makedirs('imgs/' + title)

    # 保证图片顺序
    img_num = 0
    for i in all_img_urls:
        # 文件名称
        name = '%d_' % img_num + i.split('/')[-1]
        name = name.strip()
        path = 'imgs/' + title + '/' + name

        with open(path, 'wb') as f:
            f.write(getHtml(i))
        img_num += 1


'''
给url = 'https://www.doutula.com/article/list/?page=2'
保存所有网页的图片组到文件夹
'''


def save_page_imgs(url):
    img_urls = get_img_url(url)
    for i in img_urls:
        print i
        save_img(i)


def start(urls):
    for i in urls:
        try:
            print '爬虫正在爬取 %s' % (i)
            save_page_imgs(i)
        except Exception, e:
            print e


url_group = []

# 1到500 个页面,十个页面一组
for i in range(0, 50):
    urls = []
    for j in range(10):
        url = 'https://www.doutula.com/article/list/?page=%s' % str(i * 10 + j + 1)
        urls.append(url)
    url_group.append(urls)

import multiprocessing
import time

if __name__ == "__main__":
    try:
        pool = multiprocessing.Pool(processes=50)
        cnt = 0
        for urls in url_group:
            pool.apply_async(start, (urls,))  # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
            cnt += 1

        print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"
        pool.close()
        pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
        print "finshed"
    except Exception, e:
        print e

 

© 著作权归作者所有

共有 人打赏支持
粉丝 23
博文 1095
码字总数 738706
作品 0
西安
Python爬虫系列(三)多线程爬取斗图网站(皮皮虾,我们上车)

斗图我不怕 最近看了Python多线程的相关内容,并且前几天观看了腾讯课堂潭州学院上面的关于斗图网爬取的公开课,课程内容大致是利用Python多线程爬取斗图(多页),并将图片保存到本地。自己...

yanqianglifei
2017/05/06
0
0
手把手教你写网络爬虫(2):迷你爬虫架构

原文出处:拓海 介绍 大家好!回顾上一期,我们在介绍了爬虫的基本概念之后,就利用各种工具横冲直撞的完成了一个小爬虫,目的就是猛、糙、快,方便初学者上手,建立信心。对于有一定基础的读...

拓海
04/27
0
0
java爬虫系列(一)——爬虫入门

爬虫框架介绍 java爬虫框架非常多,比如较早的有Heritrix,轻量级的crawler4j,还有现在最火的WebMagic。 他们各有各的优势和劣势,我这里顺便简单介绍一下吧。 Heritrix 优势 java的第一批爬...

Mr_OOO
2017/12/31
0
0
分分钟几万上下!用Python爬取包图网视频(附代码)切勿商用!

分析网页数据结构 目标抓取全站视频数据保存在本地, 并以网站视频名命名视频文件。 经分析我们可以发现总站数据 我们可以从这四这选项下手 分析网页数据格式 网页数据为静态 抓取下一页链接...

Python新世界
07/24
0
0
7个Python爬虫实战项目教程

有很多小伙伴在开始学习Python的时候,都特别期待能用Python写一个爬虫脚本,实验楼上有不少python爬虫的课程,这里总结几个实战项目,如果你想学习Python爬虫的话,可以挑选感兴趣的学习哦;...

实验楼
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
6分钟前
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
40分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部