这是我第一个全程自己动手做的项目,算得上是中小型的吧。网上看到好多关于python爬虫的项目,说是找工作必会,但我都感觉有些难。最后不管三七二十一,试试再说,做不出来也不会损失什么。于是选了一个豆瓣图书标签爬取的项目,github(用过好多次了,但不太了解,感觉就是一个让程序员分享成果的一个平台)上有源代码,但是没有一句注释。
终于,我花了两天的时间给整出来了,感觉非常欣慰,没想到会这么快。以前看视频学习都得两天才能大致了解一个项目,可能是现在自己的知识储备积累多了吧^_^
最重要的是,通过自己做项目,能够弥补好多以前自己不扎实的基本功,比如正则表达式,urllib, BeautifulSoup, MongoDB,以前都是跟着视频做项目使用过,也全面讲解过,但没有自己动手练习,非常的不熟练。还有对于如何存储到Excel, 如何使存储到excel中的标签按顺序排列,都是通过这个项目学到的。
不费话了,进入正题,这个项目要求是:1. 从豆瓣爬取相关图书标签; 2. 将不同种类的图书列为几个不同的列表,将各自种类的图书标签存进去; 3. 没有IP代理池,采用了延时的笨方法。
直接上代码:
import requests import re import xlwt import time import random from requests.exceptions import RequestException def do_spider(book_tag_lists): book_lists=[] for book_tag in book_tag_lists: book_list=book_spider(book_tag) book_lists.append(book_list) return book_lists def book_spider(book_tag): page_num = 0 book_list = [] try_times = 0 while (page_num<10): url = ‘https://book.douban.com/tag/‘+ book_tag + ‘?start=‘+ str(page_num * 20) time.sleep(random.uniform(0,3)) # 0 到 5 之间的随机浮点数 # time.sleep(random.randint(0,5)) 0 到 5 之间的随机整数,包括0,5 try: headers = { ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘, ‘Accept - Language‘: ‘zh - CN, zh;q = 0.9‘ } # 加上headers,网站认为是浏览器访问,就能爬取 response = requests.get(url, headers=headers) if response.text: # 这5行代码是为了爬取每种类型的所有得书使用的 response_text = response.text else: try_times+=1 continue except RequestException: return None # if try_times > 200:break # 在这儿使用了while (page_num<10)来退出 pattern = re.compile(‘<li.*?<a.*?title="(.*?)".*?<div.*?pub">(.*?)</div>.*?‘ ‘"rating_nums">(.*?)</span>.*?</li>‘, re.S) items = re.findall(pattern, response_text) # 从网页中提取相关的标签 for item in items: other = item[1].strip() other_2 = other.split(‘/‘) # 把字符串通过‘/‘符号拆分为一个列表 title = item[0] author = other_2[0].strip() date = other_2[-2].strip() rating_nums = item[2] print(title,author,date,rating_nums) book_list.append([title, author, date, rating_nums]) try_times = 0 page_num += 1 print(‘Downloading Information From Page_‘ + str(page_num)) return book_list # 将爬取得内容写到Excel中 def print_book_list_excel(book_lists, book_tag_lists): wb = xlwt.Workbook(encoding=‘utf-8‘) for i in range(len(book_tag_lists)): ws = wb.add_sheet(book_tag_lists[i]) ws.write(0, 1, ‘标题‘) ws.write(0, 2, ‘作者‘) ws.write(0, 3, ‘出版日期‘) ws.write(0, 4, ‘评分‘) count = 0 for bl in book_lists[i]: count+=1 ws.write(count,0,count) for j in range(4): ws.write(count,j+1,bl[j]) wb.save(‘excel.xls‘) def main(): book_tag_lists = [‘小说‘,‘漫画‘,‘历史‘,‘经济学‘,‘互联网‘] book_lists = do_spider(book_tag_lists) # 已经调用过book_spider了 print_book_list_excel(book_lists,book_tag_lists) if __name__ == ‘__main__‘: main()
项目制作流程:1.先按照以前的经验,爬取了“小说”的10页图书标签,并写在文本文档中。(中间遇到许多挫折,尤其是正则表达式这块)
2. 文本文档的内容不是按照“标题”、“作者”、“出版日期”、“评分”的顺序来排列的,而是乱序(因为for循环从字典中读数据本来就是乱序)。
于是看了下载的代码,采用了 book_list.append([title, author, date, rating_nums]) 来代替字典形式(因为for循环从列表中读数据是按顺序来的)。
3. 将其写入Excel表格,先用了下载的代码方法,不管用,只有sheet表格,没有写入的内容。网上查了一些方法,结合下载的代码,就实现了。
4. 最后改写代码为每个种类的图书建一个sheet表格。
原文地址:https://www.cnblogs.com/zhangguoxv/p/10061817.html