python学习笔记
# 爬虫的流程分析:
1. 请求数据:requests库(这个库可以非常方便的去请求网络数据)
* 安装方法:pip install requests
2. 将请求下来的数据解析出来,获取我们想要的数据,把不想要的数据抛弃掉。
* BeautifulSoup:pip install bs4
* lxml:pip install lxml
3. 将解析后的数据保存下来。如果是文字类型的,可以保存到文件中或者是数据库中或者缓存中都可以。如果是文件类型,比如图片,视频,那么可以保存到硬盘中。
4. 无论你的爬虫是大还是小,他都是由这几个模块组成的。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 导入之前安装的库 import requests from bs4 import BeautifulSoup # 首先定义以个变量url并赋值为目标网站'http://www.0011kytt.com'以及要搜索的电影名movie_name # 注意引号,字符串必须用引号包围起来 movie_name = '武状元苏乞儿' url = 'https://www.qsyyw.com/ctview/28755.html' # 然后用request.get()来获取网页 r = requests.get(url) # 这里要根据网页的编码来设置解码,这个目标网站编码为'utf-8' r.encoding = 'utf-8' # 然后获取网页源码并赋值给变量html html = r.text # 最后打印出网页源码 #print(html) # 这里利用BeautifulSoup库来解析网页的源码并赋值给soup,方便后面的寻找 soup = BeautifulSoup(html, "lxml") # 因为我们已经知道搜索框在一个叫<div class="search">的地方 # 所以根据class="search"来找就好了 # 注意,因为class是python关键字,所以这里要用class_,这是BeautifulSoup的规定 search = soup.find(class_='fed-navs-search') # OK 打印出来看看找得对不对 #print(search) # 网站搜索页面的url为http://www.0011kytt.com/search/search.php search_url = 'https://www.qsyyw.com/vodsearch/-------------.html?wd=精武门' # 从网页源码里看到输入位置的input中有个name='keywords' # 这个keywords就是用来记录我们输入电影名的变量 # 于是,我们构造以下变量,用来让爬虫往搜索框填电影名 formdata = {'type': 'text', 'keywords': movie_name} # requests.post就可以把formdata填进搜索框,并得到搜索结果页面赋值给r_r rr = requests.post(search_url, formdata) # 同样需要解码 rr.encoding = 'utf-8' # 获取网页源码并赋值给变量html rhtml = rr.text # 打印看看对不对 #print(rhtml) # 首先还是用BeautifulSoup库来解析网页的源码 r_soup = BeautifulSoup(rhtml, "lxml") # 再根据class_='item_pic'找到所有搜索结果,有可能搜索到多个匹配的结果 movie_div_list = r_soup.find_all(class_='fed-deta-button') #print(movie_div_list) # 创建一个空的列表movie_url_list来存储搜索结果的详情页链接 movie_url_list = [] # 因为有可能搜索到多个匹配的结果 # 所以这里用一个循环来获取所有搜索结果的电影详情页链接 for movie_div in movie_div_list: # 对每一个搜索结果,找到其中的href里存着的详情页链接 movie_url = movie_div.a.attrs['href'] # 把详情页链接存到movie_url_list中 movie_url_list.append(movie_url) # OK 打印看看所有搜索结果的详情页链接 print(movie_url_list)
代码进阶二:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 导入之前安装的库 import json import requests from bs4 import BeautifulSoup from urllib import ` # url_temp = 'https://lady.163.com/special/00264OOD/data_nd_sense_0{}.js?callback=data_callback' # return_list = [] # url = url_temp.format(7) # response = requests.get(url) # # if response.status_code != 200: # # continue # content = response.text # 获取响应正文 # _content = formatContent(content) # 格式化json字符串 # result = json.loads(_content) # return_list.append(result) url = 'https://www.doutula.com/photo/list/?page=1' #先进行heder头部的伪装模拟认为操作 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36", "Referer":url } # 然后用request.get()来获取网页 r = requests.get(url,headers=headers) # 这里要根据网页的编码来设置解码,这个目标网站编码为'utf-8' r.encoding = 'UTF-8' # 然后获取网页源码并赋值给变量html html = r.text # 最后打印出网页源码 #print(html) # 首先还是用BeautifulSoup库来解析网页的源码 r_soup = BeautifulSoup(html, "lxml") # 再根据class_='img-responsive'找到所有搜索结果,有可能搜索到多个匹配的结果, 搜索所有class是这个的img图片div内容 img_list = r_soup.find_all("img",attrs={"class":"img-responsive lazy image_dta"}) #print(img_list) # 创建一个空的列表movie_url_list来存储搜索结果的详情页链接 #movie_url_list = [] for img in img_list: img_url = img['data-original'] request.urlretrieve(img_url,"test.jpg") break #movie_url_list.append(img_url) #print(movie_url_list)
进阶三:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 导入之前安装的库 import json import requests from bs4 import BeautifulSoup from urllib import request import os # url_temp = 'https://lady.163.com/special/00264OOD/data_nd_sense_0{}.js?callback=data_callback' # return_list = [] # url = url_temp.format(7) # response = requests.get(url) # # if response.status_code != 200: # # continue # content = response.text # 获取响应正文 # _content = formatContent(content) # 格式化json字符串 # result = json.loads(_content) # return_list.append(result) #用来存储所有页面url PAGE_URLS = [] def parse_page(pageurl): #先进行heder头部的伪装模拟认为操作 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36", "Referer":pageurl } # 然后用request.get()来获取网页 r = requests.get(pageurl,headers=headers) # 这里要根据网页的编码来设置解码,这个目标网站编码为'utf-8' r.encoding = 'UTF-8' # 然后获取网页源码并赋值给变量html html = r.text # 最后打印出网页源码 #print(html) # 首先还是用BeautifulSoup库来解析网页的源码 r_soup = BeautifulSoup(html, "lxml") # 再根据class_='img-responsive'找到所有搜索结果,有可能搜索到多个匹配的结果, 搜索所有class是这个的img图片div内容 img_list = r_soup.find_all("img",attrs={"class":"img-responsive lazy image_dta"}) #print(img_list) # 创建一个空的列表movie_url_list来存储搜索结果的详情页链接 #movie_url_list = [] for img in img_list: img_url = img['data-original'] #http://img.doutula.com/production/uploads/image/2021/06/26/20210626674557_tRkLNp.jpg splits = img_url.split("/")[-1] #将图片路径分割,拿到最后一个也就是-1 的位置 ospath = os.path.join("images",splits) # print(ospath) # break request.urlretrieve(img_url,ospath) #movie_url_list.append(img_url) #print(movie_url_list) def main(): #1:现获取所有页面url for x in range(1,3): page_url = 'https://www.doutula.com/photo/list/?page='+str(x) # print(page_url) # break PAGE_URLS.append(page_url) #2.获取每一页的图片数据 for pageurl in PAGE_URLS: parse_page(pageurl) #调用上面的函数挨个处理每页的数据 if __name__ == '__main__': main()
进阶四:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 导入之前安装的库 import json import requests from bs4 import BeautifulSoup from urllib import request import os # url_temp = 'https://lady.163.com/special/00264OOD/data_nd_sense_0{}.js?callback=data_callback' # return_list = [] # url = url_temp.format(7) # response = requests.get(url) # # if response.status_code != 200: # # continue # content = response.text # 获取响应正文 # _content = formatContent(content) # 格式化json字符串 # result = json.loads(_content) # return_list.append(result) #用来存储所有页面url PAGE_URLS = [] def parse_page(pageurl): #先进行heder头部的伪装模拟认为操作 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36", "Referer":pageurl } # 然后用request.get()来获取网页 r = requests.get(pageurl,headers=headers) # 这里要根据网页的编码来设置解码,这个目标网站编码为'utf-8' r.encoding = 'UTF-8' # 然后获取网页源码并赋值给变量html html = r.text # 最后打印出网页源码 #print(html) # 首先还是用BeautifulSoup库来解析网页的源码 r_soup = BeautifulSoup(html, "lxml") # 再根据class_='img-responsive'找到所有搜索结果,有可能搜索到多个匹配的结果, 搜索所有class是这个的img图片div内容 img_list = r_soup.find_all("img",attrs={"class":"img-responsive lazy image_dta"}) #print(img_list) # 创建一个空的列表movie_url_list来存储搜索结果的详情页链接 #movie_url_list = [] for img in img_list: img_url = img['data-original'] #http://img.doutula.com/production/uploads/image/2021/06/26/20210626674557_tRkLNp.jpg splits = img_url.split("/")[-1] #将图片路径分割,拿到最后一个也就是-1 的位置 ospath = os.path.join("images",splits) # print(ospath) # break request.urlretrieve(img_url,ospath) #movie_url_list.append(img_url) #print(movie_url_list) def main(): #1:现获取所有页面url for x in range(1,3): page_url = 'https://www.doutula.com/photo/list/?page='+str(x) # print(page_url) # break PAGE_URLS.append(page_url) #2.获取每一页的图片数据 for pageurl in PAGE_URLS: parse_page(pageurl) #调用上面的函数挨个处理每页的数据 if __name__ == '__main__': main()
多进程:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 导入之前安装的库 import time import threading def greet(index): print("helloworld-%d"%index) time.sleep(0.5) #单线程,挨个执行 def line_run(): for x in range(5): greet(x) #多线程,一次性就执行完了 def duoxian_run(): for x in range(5): #多线程调用greet方法,讲x传递过去 th = threading.Thread(target=greet,args=[x]) th.start() if __name__ == '__main__': #line_run() duoxian_run()