主要内容:
spider: 写的特别好https://www.cnblogs.com/x-pyue/p/7795315.html
1 多线程数据爬取

import requests from lxml import etree import random import re from multiprocessing.dummy import Pool pool = Pool(5) def saveVideo(data): file_path = str(random.randint(0,1000)) + ".mp4" with open(file_path, "wb") as f: f.write(data) print(file_path+"下载成功") headers = { "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36', } url = 'https://www.pearvideo.com/' page_text = requests.get(url=url, headers=headers).text tree = etree.HTML(page_text) li_list = tree.xpath("//div[@class='vervideo-tlist-bd clearfix']/ul/li") video_url_list = [] for li in li_list: detail_url = "https://www.pearvideo.com/" + li.xpath(".//a/@href")[0] detail_name = li.xpath(".//a//div[@class='vervideo-name']/text()")[0] detail_text = requests.get(url = detail_url, headers=headers).text open_addr = re.findall('srcUrl="(.*?)"',detail_text, re.S )[0] video_url_list.append(open_addr) #并发下载视频 downloadVideo = lambda link:requests.get(url=link,headers=headers).content #map返回的列表中存储的就是下载完毕的视频二进制的数据值 video_data_list = pool.map(downloadVideo,video_url_list) pool.map(saveVideo,video_data_list) pool.close() pool.join()
2 selenium
a selenium的认识
selenium介绍:是用来加载页面中动态的数据 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵, 可以按指定的命令自动化操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的页面,甚至页面截屏,或者判断网站上某些动作是否发生。 Selenium自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行, 所有我们而已用一个叫PhantomJS的工具代替真实的浏览器。
b PhantomJS的简单介绍
PhantomJS是一个基于Webkit的"无界面"(headless)浏览器,它会把网站加载到内存并执行页面上的JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器更高效。 如果我们把Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理JavaScript、Cookie、headers,以及任何我们真实用户需要做的事情。
c 爬虫实例

# 谷歌无头浏览器, 添加option参数也可以无界面. from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') from time import sleep bro = webdriver.Chrome(executable_path=r"C:Users26897Desktop爬虫day 05 多线程 seleniumchromedriver.exe",chrome_options=chrome_options) bro.get(url="https://www.baidu.com") # 获取input框 my_input = bro.find_element_by_id("kw") my_input.send_keys("阳光很好, 眼睛眯着") button = bro.find_element_by_id("su") button.click() sleep(1) #获取当前浏览器显示的页面的页面源码 page_text = bro.page_source bro.quit()
爬取豆瓣电影:

import requests from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path=r"C:Users26897Desktop爬虫day 05 多线程 seleniumchromedriver.exe") bro.get(url="https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=") js = 'window.scrollTo(0,document.body.scrollHeight)' bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) page_text = bro.page_source with open("./dianying.html", "w", encoding='utf-8') as f: f.write(page_text) bro.quit()
爬取qq空间:

# qq空间 import requests from lxml import etree from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path=r"C:Users26897Desktop爬虫day 05 多线程 seleniumchromedriver.exe") bro.get(url="https://qzone.qq.com/") # 定位到frame bro.switch_to.frame("login_frame") bro.find_element_by_id("switcher_plogin").click() sleep(1) u_input = bro.find_element_by_id('u') p_input = bro.find_element_by_id('p') u_input.send_keys("2689709108") p_input.send_keys("gyh412724") sleep(1) button = bro.find_element_by_id('login_button') button.click() sleep(1) js = 'window.scrollTo(0,document.body.scrollHeight)' bro.execute_script(js) sleep(1) bro.execute_script(js) sleep(1) page_text = bro.page_source sleep(5) tree = etree.HTML(page_text) div_list = tree.xpath('//div[@class="f-info"]') for div in div_list: print(div) title = div.xpath(".//text()") # print(title) title = ''.join(title) bro.quit()
3 : 移动端数据爬取:https://www.cnblogs.com/bobo-zhang/p/10068994.html
4: scrapy框架初始
0 scrapy的概念:
scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量代码,就能够快速的抓取到数据内容。Scrapy 使用了 Twisted['twɪstɪd]
(其主要对手是Tornado)异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
a 安装scrapy流程:
1 下载: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted, 在对应的路径中打开cmd, 然后安装, pip install 下载名
2 安装pywin32, pip install pywin32
3 安装scrapy pip install pywin32
b 使用scrapy创建项目
1 进入到指定的项目路径下, 安装scrapy, 然后创建项目, scrapy startproject 项目名
2 进入到项目中, cmd 中直接cd 文件名
3 创建爬虫文件, scrapy genspider 文件名 起始的url
4 进入到pycharm中进行编辑
5 在cmd中运行项目, scrapy crawl 爬虫文件名 --nolog (无log文件)
c scrapy框架工作流程:
1.首先Spiders(爬虫)将需要发送请求的url(requests)经ScrapyEngine(引擎)交给Scheduler(调度器)。
2.Scheduler(排序,入队)处理后,经ScrapyEngine,DownloaderMiddlewares(可选,主要有User_Agent, Proxy代理)交给Downloader。
3.Downloader向互联网发送请求,并接收下载响应(response)。将响应(response)经ScrapyEngine,SpiderMiddlewares(可选)交给Spiders。
4.Spiders处理response,提取数据并将数据经ScrapyEngine交给ItemPipeline保存(可以是本地,可以是数据库)。
5. 提取url重新经ScrapyEngine交给Scheduler进行下一个循环。直到无Url请求程序停止结束。