# DouBan_Crawler **Repository Path**: simonck666/douban-crawler ## Basic Information - **Project Name**: DouBan_Crawler - **Description**: Learning the python crawler - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-02 - **Last Updated**: 2021-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python 爬虫 ## 1. 任务介绍 ### 1.1需求分析 爬取豆瓣电影Top250的基本信息: - 名称 - 评分 - 评价数 - 电影概况 - 电影链接 > 网址: https://movie.douban.com/top250 ## 2. 爬虫介绍 ### 2.1 爬虫本质 **模拟浏览器**打开网页,获取网页中我们想要的那部分数据 ### 2.2 搜索引擎原理 索引区 --> 网页 <--> 临时库 --> 索引区 --> 搜索引擎查询 ## 3. 基本流程 ### 3.1 准备工作 通过浏览器查看分析目标王爷,学习编程基础规范 ### 3.2 获取数据 通过HTTP库向目标站点发起请求,请求可以包含额外的 header 等信息,如果服务器能正常相应,会得到一个 Response, 便是索要获取的页面内容 ### 3.3 解析内容 得到的内容可能是 HTML,json 等格式,可以使用**页面解析库,正则表达式**等进行解析 ### 3.4 保存数据 保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件 > `https://movie.douban.com/top250?start=0&filter=` URL中:start=0: 从 0 开始,filter:过滤器 > `F12 中 NetWork`: > > 1. User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 Query String Parametersview sourceview URL encoded`: 浏览器信息 > 2. `Cookie:bid=z15SZEqOWVU; _pk_ses.100001.4cf6=*; ap_v=0,6.0; __utma=30149280.1960923673.1619929529.1619929529.1619929529.1; __utmb=30149280.0.10.1619929529; __utmc=30149280; __utmz=30149280.1619929529.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1555240713.1619929530.1619929530.1619929530.1; __utmb=223695111.0.10.1619929530; __utmc=223695111; __utmz=223695111.1619929530.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __yadk_uid=MfzMWfQvpExublVZ0xhTrV0A4jk2ArkC; __gads=ID=9b4664f0b7d43b3e-224ddde5b2c70037:T=1619929529:RT=1619929529:S=ALNI_MaY-uohYnMnocR1lK46Ke1qVTz7nA; ll="118283"; _vwo_uuid_v2=D98C01BCE068FE3214B749EF6A96B1CEF|356e6caae6edd7db212a3e7cceae83d0; _pk_id.100001.4cf6=16fb8b6b423851c1.1619929529.1.1619930362.1619929529.` : 爬取登陆以后才会有的信息,需要使用 Cookie ## 4. 编码规范 ### 4.1 一般 Python 程序第一行加入 `# -*- coding: utf-8 -*- or # coding=utf-8` 这样代码中可以包含中文 ### 4.2 基本代码编写桂芬 ### 4.3 Python 文件中可以加入 main 函数用作测试程序 `if __name__ == "__main__: " : 主程序在这句话之后` ```python # -*- coding = utf-8 -*- def main(): print("hello") if __name__ == "__main__": # 当当前程序执行时 # 调用函数 main() ``` ### 4.4 Python 使用 `#`添加注释 ```python #!/usr/bin/env python # -*- coding = utf-8 -*- ''' @Project : doubanTest @File : t1.py @IDE : PyCharm @Author : Simon @Date : 2021/5/2 13:08 ''' def add(a, b): return a + b print(add(2, 3)) ``` ```python #!/usr/bin/env python # -*- coding = utf-8 -*- ''' @Project : doubanTest @File : t2.py @IDE : PyCharm @Author : Simon @Date : 2021/5/2 13:09 ''' from testImport import t1 print(t1.add(3, 5)) ``` ## 5. BeautifulSoup ### 5.1 引入模块 - 模块(module):用来从逻辑上组织 python 代码(变量,函数,类),本质就是` py`文件,提高代码的可维护性,Python 使用`import`来导入模块 ```python #!/usr/bin/env python # -*- coding = utf-8 -*- ''' @Project : doubanTest @File : spider.py @IDE : PyCharm @Author : Simon @Date : 2021/5/2 13:09 ''' # pip install xxx # -*- coding = utf-8 -*- from bs4 import BeautifulSoup # 网页解析,获取数据 import re # 正则表达式,进行文字匹配 import urllib.request, urllib.error # 制定 URL,获取网页数据 import xlwt # 进行 excel 操作 import sqlite3 # 进行 SQLite 数据库操作 def main(): baseURL = "https://movie.douban.com/top250?stat=" # 1. 爬取网页 dataList = getData(baseURL) # 2. 逐一解析数据 savePath = '.\\DouBanMovieTop250.xls' # 3. 保存数据 saveData(savePath) ############################################# ############################################# # 1. 爬取网页 def getData(baseURL): dataList = [] # 2. 逐一解析数据 return dataList ############################################# ############################################# # 3. 保存数据 def saveData(savePath): print("save..") if __name__ == "__main__": # 当当前程序执行时 # 调用函数 main() ``` #### 5.1.1 模块检测 ##### 5.1.1.1 urllib GET ```python #!/usr/bin/env python 3.9 # -*- coding = utr-8 -*- ''' @Project: DouBan @File: testUrllib_GET.py @IDE: PyCharm @Author: Simon @Date: 5/2/21 11:42 PM ''' from urllib.request import urlopen, Request url = 'https://movie.douban.com/top250?start=%s&filter=' headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'} # 58 City # url2 = 'https://zh.58.com/searchjob.shtml?spm=31749658231.zhaopin_360&utm_source=1234' # headers2 = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'} # Original GET Requirement ret = Request(url, headers=headers) # ret = Request(url2, headers=headers2) res = urlopen(ret) aa = res.read().decode('utf-8') print(aa) ``` > `http://httpbin.org/`: 用来测试 HTTP & HTTPS 的返回请求等 ##### 5.1.1.2 urllib POST ```python #!/usr/bin/env python 3.9 # -*- coding = utr-8 -*- ''' @Project: DouBan @File: testUrllib_POST.py @IDE: PyCharm @Author: Simon @Date: 5/3/21 12:47 AM ''' from urllib.request import urlopen, Request # 对于post进行解析 import urllib.parse # Original post Requirement # Using http://httpbin.org/ to Test url = 'http://httpbin.org/post' headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'} # 封装数据 data = bytes(urllib.parse.urlencode({"hello":"world"}), encoding="utf-8") retp = Request(url, headers=headers) resp = urlopen(retp, data=data) aa = resp.read().decode("utf-8") print(aa) ``` ##### 5.1.1.3 urllib TIMEOUT ```python #!/usr/bin/env python 3.9 # -*- coding = utr-8 -*- ''' @Project: DouBan @File: testUrllib_TIMEOUT.py @IDE: PyCharm @Author: Simon @Date: 5/3/21 12:51 AM ''' # 超时处理 import urllib.request from urllib.request import urlopen, Request url = 'http://httpbin.org/get' try: aa = urllib.request.urlopen(url, timeout=0.01) print(aa.read().decode("utf-8")) except urllib.error.URLError as e: print("Time out!!") ``` ## 6. 保存数据 ### 6.1 Excel 表存储 利用 python 库 `xlwt` 将抽取的数据 `datalist` 写入 Excel 表格 - 调用 - 以 utf-8 编码创建一个 Excel 对象 # Reference > 4.4.0 中文文档: > https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#