python 豆瓣图片的爬取

本文通过Python实现了一个基于生产者和消费者模型的豆瓣图片爬虫。该爬虫能够抓取推荐相册中的图片,并通过多线程提高下载效率。

   豆瓣图片的抓取:在python中实现生产者和消费者模型的实现,大家可以参考这篇文章 http://www.bkjia.com/Pythonjc/978391.html

个人认为是讲的比较易懂的,只要看看仿写几个例子,感觉这一块就差不多了。下面的代码并没有抓取豆瓣相册的全部,这是找了一个推荐较多的抓取来玩玩,也只抓取前面20页,每页有30张图片,所以可以根据这个去跟新url。维护了一个list来保存图片的url,一个消费者函数来下载图片,一个生产者函数来取图片的url , 下面看代码:

# _*_coding:utf-8_*_

import urllib2
import cookielib
from bs4 import BeautifulSoup
import re
import time
import threading

start = start_time = time.ctime()
s = []
max_length = 30
condition = threading.Condition()


class Producer(threading.Thread):
    def run(self):
        for i in xrange(20):
            condition.acquire()
            if len(s) == max_length:
                print 's is full'
                condition.wait()
            request_url = 'https://site.douban.com/widget/public_album/86320/?start=%s' % (i*30) #推荐相册的url

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

            opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
            response = urllib2.Request(request_url, headers=headers)
            html = opener.open(response)
            soup = BeautifulSoup(html)
            img_urls = soup.find_all('a', {'class': 'album_photo'})

            for item in img_urls:
                p = re.compile(r'src="(.*?)"')
                img_url = p.search(str(item.find('img'))).group(1)  #图片的url
                s.append(img_url)
                print 'producer somthing'
            condition.notify()


class Consumer(threading.Thread):
    def run(self):
        count = 0
        while True:
            if condition.acquire():
                if not s:
                    print 's is empty wait'
                    condition.wait()
                img_url = s.pop(0)
                print 'consumer something'
                with open('E:\\douban\\%s.jpg' %count, 'wb') as fp:
                    try:
                        response_img = urllib2.urlopen(img_url).read() #下载图片
                        fp.write(response_img)
                    except Exception:
                        print 'error'
                count += 1
                condition.notify()
                condition.release()

t1 = Producer()
c1 = Consumer()
t1.start()
c1.start()

嗯, 差不多就这样,大家还可以多开几个线程,使得下载速度更快点,毕竟如果抓取大量的图片的话,io操作会比较耗时。

这是图片的部分截图:

 

 

转载于:https://www.cnblogs.com/viver-python/p/6064620.html

### Python爬取豆瓣电影数据的方法 要使用Python爬取豆瓣电影的数据,可以按照以下方式构建程序逻辑。以下是详细的说明: #### 1. 导入必要的库 为了完成网络请求和数据分析的任务,需要引入一些常用的第三方库,例如`requests`用于发起HTTP请求,`fake_useragent`模拟浏览器行为,以及`csv`保存抓取到的结果。 ```python import requests from fake_useragent import UserAgent import json import csv ``` 这些库的作用分别如下: - `requests`: 发起GET/POST请求并接收响应。 - `fake_useragent`: 随机生成User-Agent字符串,防止被目标网站识别为自动化脚本。 - `json`: 解析JSON格式的返回数据。 - `csv`: 将结果写入CSV文件以便后续分析[^2]。 --- #### 2. 定义类结构 创建一个名为`Doban`的类来封装整个爬虫的功能。初始化方法中设置URL模板和其他参数。 ```python class Doban(object): def __init__(self): self.base_url = "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=time&page_limit=20&page_start={}" self.headers = {'User-Agent': UserAgent().random} ``` 这里需要注意的是: - URL中的`type=movie`表示只查询电影类型的内容;如果想扩展至电视剧或其他媒体形式,则需调整此部分。 - 使用随机化的User-Agent有助于规避反爬机制。 --- #### 3. 编写核心爬取函数 定义一个`spyder`方法负责实际的数据获取工作。该方法会遍历每一页的目标页面,并从中提取所需信息。 ```python def spyder(self): for page in range(0, 100, 20): # 假设最多爬取前五页(即100条记录) print(f"正在爬取第 {page//20 + 1} 页...") response = requests.get(url=self.base_url.format(page), headers=self.headers) if response.status_code != 200: print("请求失败:", response.status_code) continue try: data_list = response.json()['subjects'] for movie_info in data_list: title = movie_info['title'] rate = movie_info['rate'] cover_image = movie_info['cover'] yield { '标题': title, '评分': rate, '封面图片链接': cover_image } except Exception as e: print("解析错误:", str(e)) ``` 上述代码实现了分页加载功能,并针对每次API调用后的JSON对象进行了初步处理。对于每一部影片,至少保留其名称、评价分数及宣传图链接作为基础属性[^1]。 --- #### 4. 存储结果到本地文件 最后一步是把收集来的资料存储下来供进一步研究之用。下面展示了一个简单的例子——将所有项目逐行追加进CSV文档当中去。 ```python def save_to_csv(self, filename, items): fieldnames = ['标题', '评分', '封面图片链接'] with open(filename, mode='w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() writer.writerows(items) if __name__ == "__main__": crawler = Doban() movies = list(crawler.spyder()) crawler.save_to_csv('douban_movies.csv', movies) ``` 这样就完成了从网页读取直至持久化的过程[^4]。 --- ### 注意事项 由于豆瓣官方可能随时更改接口规则或者加强防护措施,在开发过程中务必遵循道德准则,合理控制频率以免给服务器带来过大负担。同时也要留意法律风险,确保所做的一切均符合当地法律法规的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值