python++++多线程爬取豆瓣网的书单

爬虫公开 专栏收录该内容
5 篇文章 0 订阅

import requests as reqs
import threading
import time
#Some User Agents
hds={'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'}



from scrapy import Selector
def html_parse(html_str,xpath_expr):
      sel = Selector(text=htmltext)
      xp = lambda x: sel.xpath(x).extract()
      return xp(xpathstr)
   

class myThread_detail(threading.Thread):
    """docstring for myThead"""
    def __init__(self, url,people_nums):
        super(myThread_detail, self).__init__()
        self.url = url
        self.people_nums=people_nums


    def run(self,):
        loc=threading.Lock()
        data=reqs.get(self.url,headers=hds).content.decode()
        #返回评论人数
        loc.acquire()
        try:
            self.people_nums.append(html_parse(data,'//a[@class="rating_people"]//span/text()')[0])
        except IndexError as e:
            self.people_nums.append(" ")
        loc.release()





# 根据标签爬取单个标签下的图书列表
def book_spider(book_tag):
    #url='http://www.douban.com/tag/小说/book?start=0' # For Test
    page_num=0
    url=r'http://www.douban.com/tag/'+book_tag+'/book?start='
    for i in range(0,15*10,15):
        urls=url+str(i)
        print(urls)
        data=reqs.get(urls,headers=hds).content.decode()
        # ==============以下是要爬取的三个字段,要爬取更多的字段可以在这里扩展================
        # 书名
        booknames     =html_parse(data,'//a[@class="title"]/text()')
        #描述
        descs         =html_parse(data,'//div[@class="desc"]/text()')
        detail_links  =html_parse(data,'''//a[@class="title"]/@href''')
        
        # 评论人数
        people_nums=[]
        
        #进入详情页面抓取,评论数
        tt=[]
        for link in detail_links:
            t=myThread_detail(link,people_nums)
            t.start()
            time.sleep(0.1)
            tt.append(t)
        for th in tt:
            th.join()
        yield (booknames,descs,people_nums)

    


#获取评论人数,获取详细信息
# https://book.douban.com/subject/6082808/?from=tag_all for test

def get_people_num(url):
    data=reqs.get(url,headers=hds).content.decode()
    #返回评论人数
    return html_parse(data,'//a[@class="rating_people"]//span/text()')


#爬取多个标签(需要传入标签列表参数)
def do_spider(book_tag_lists):
    for i in book_tag_lists:
        for item in book_spider(i):
            
            # 把搞到的数据打印出来
            print(item)



    # 返回的是个复数形式,也就是说是个多个标签的最终结果
    # return book_lists
    return 0



#把数据写到电子表格中。
def print_book_lists_excel(book_lists,book_tag_lists):
    '''每个标签一张表,每张表就一个标签的书籍列表;




    如果你有兴趣自己写吧,也可以问我!'''



    pass




if __name__=='__main__':
    #book_tag_lists = ['心理','判断与决策','算法','数据结构','经济','历史']
    #book_tag_lists = ['传记','哲学','编程','创业','理财','社会学','佛教']
    #book_tag_lists = ['思想','科技','科学','web','股票','爱情','两性']
    #book_tag_lists = ['计算机','机器学习','linux','android','数据库','互联网']
    #book_tag_lists = ['数学']
    #book_tag_lists = ['摄影','设计','音乐','旅行','教育','成长','情感','育儿','健康','养生']
    #book_tag_lists = ['商业','理财','管理']  
    #book_tag_lists = ['名著']
    #book_tag_lists = ['科普','经典','生活','心灵','文学']
    #book_tag_lists = ['科幻','思维','金融']
    # book_tag_lists = ['小说','时间管理','投资','文化','宗教']
    book_tag_lists = ['小说']
    book_lists=do_spider(book_tag_lists)
    print_book_lists_excel(book_lists,book_tag_lists)





    ###########################################################################
    # 运行一次就好,若果你运行第二次,立马会被封ip ,当然你可以换一个ip;继续运行。 ##

参考地址: 

 https://github.com/lanbing510/DouBanSpider/blob/master/doubanSpider.py

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值