首页 文章 精选 留言 我的

精选列表

搜索[自适应爬虫],共4662篇文章
优秀的个人博客,低调大师

Python网络爬虫(requests, 代理,Web认证, SSL证书认证)

requests模块 代理(proxies) 西刺代理 快代理 全网代理 高匿ip:看不到真实ip 透明ip:可以看到代理 和 真实ip 普通代理 proxies = {"协议":"协议://IP地址:端口号"} '''01_普通代理示例.py''' import requests url = "http://www.baidu.com/" proxies = {"http":"http://183.129.207.82:11597"} headers = {"User-Agent":"Mozilla/5.0"} res = requests.get(url,proxies=proxies,headers=headers) print(res.status_code) 私密代理 proxies = {"协议": "协议://用户名:密码@ip地址:端口号"} '''02_私密代理示例.py''' import requests url = "http://httpbin.org/get" headers = {"User-Agent":"Mozilla/5.0"} proxies = {"http":"http://309435365:szayclhp@123.206.119.108:16817"} res = requests.get(url,proxies=proxies,headers=headers) res.encoding = "utf-8" print(res.text) 爬取链家二手房信息 --> 存到MySQL数据库中 '''05_链家数据ToMongo.py''' import requests import re import pymysql import warnings class LianjiaSpider: def __init__(self): self.baseurl = "https://bj.lianjia.com/ershoufang/pg" self.page = 1 self.headers = {"User-Agent": "Mozilla/5.0"} self.proxies = {"http": "http://127.0.0.1:8888"} self.db = pymysql.connect("localhost", "root","ParisPython",charset="utf8") self.cursor = self.db.cursor() def getPage(self,url): res = requests.get(url,proxies=self.proxies,headers=self.headers,timeout=5) res.encoding = "utf-8" html = res.text print("页面爬取成功,正在解析...") self.parsePage(html) def parsePage(self,html): p = re.compile('<div class="houseInfo".*?data-el="region">(.*?)</a>.*?<div class="totalPrice">.*?<span>(.*?)</span>(.*?)</div>',re.S) r_list = p.findall(html) # [("天通苑","480","万"),()..] print("页面解析完成,正在存入数据库...") self.writeTomysql(r_list) def writeTomysql(self,r_list): c_db = "create database if not exists Lianjiadb \ character set utf8" u_db = "use Lianjiadb" c_tab = "create table if not exists housePrice( \ id int primary key auto_increment,\ housename varchar(50), \ totalprice int)charset=utf8" warnings.filterwarnings("ignore") try: self.cursor.execute(c_db) self.cursor.execute(u_db) self.cursor.execute(c_tab) except Warning: pass ins = "insert into housePrice(housename,totalprice) \ values(%s,%s)" for r_tuple in r_list: name = r_tuple[0].strip() price = float(r_tuple[1].strip())*10000 L = [name,price] self.cursor.execute(ins,L) self.db.commit() print("存入数据库成功") def workOn(self): while True: c = input("爬取按y(q退出):") if c.strip().lower() == "y": url = self.baseurl + str(self.page) + "/" self.getPage(url) self.page += 1 else: self.cursor.close() self.db.close() print("爬取结束,谢谢使用!") break if __name__ == "__main__": spider = LianjiaSpider() spider.workOn() 找URL https://bj.lianjia.com/ershoufang/pg1/ 正则 <div class="houseInfo".*?data-el="region">(.*?)</a>.*?<div="totalPrice">.*?<span>(.*?)</span>(.*?)</div> Web客户端验证(参数名:auth) auth=("用户名","密码") 案例 :09_Web客户端验证.py '''09_Web客户端验证.py''' import requests import re class NoteSpider: def __init__(self): self.headers = {"User-Agent":"Mozilla/5.0"} self.url = "网址" self.proxies = {"http":"http://309435365:szayclhp@123.206.119.108:16817"} # auth参数存储用户名和密码(必须为元组) self.auth = ("账号","密码") def getParsePage(self): res = requests.get(self.url, proxies=self.proxies, headers=self.headers, auth=self.auth, timeout=3) res.encoding = "utf-8" html = res.text print(html) p = re.compile('<a href=".*?>(.*?)</a>',re.S) r_list = p.findall(html) print(r_list) self.writePage(r_list) def writePage(self,r_list): print("开始写入文件...") with open("达内科技.txt","a") as f: for r_str in r_list: f.write(r_str + "\n\n") print("写入成功") if __name__ == "__main__": spider = NoteSpider() spider.getParsePage() SSL证书认证(参数名:verify) verify = True : 默认,进行SSL证书认证 verify = False: 不做认证 '''10_SSL证书认证示例.py''' import requests url = "https://www.12306.cn/mormhweb/" headers = {"User-Agent":"Mozilla/5.0"} res = requests.get(url,headers=headers,verify=False) res.encoding = "utf-8" print(res.text) urllib.request中Handler处理器 定义 自定义的urlopen()方法,urlopen()方法是一个特殊的opener(模块已定义好), 不支持代理等功能,通过Handler处理器对象来自定义opener对象 常用方法 build_opener(Handler处理器对象) :创建opener对象 opener.open(url,参数) # 创建Handler处理器对象 http_handler = urllib.request.HTTPHandler() #proxy_handler = urllib.request.ProxyHandler() # 创建自定义的opener对象 opener = urllib.request.build_opener(http_handler) # 利用opener对象的open()方法发请求 req = urllib.request.Request(url) res = opener.open(req) print(res.read().decode("utf-8")) Handler处理器分类 HTTPHandler() :没有任何特殊功能 ProxyHandler(普通代理) 代理: {"协议":"IP地址:端口号"} ProxyBasicAuthHandler(密码管理器对象) :私密代理 HTTPBasicAuthHandler(密码管理器对象) : web客户端认证 密码管理器对象作用 私密代理 Web客户端认证 程序实现流程 创建密码管理器对象 pwdmg = urllib.request.HTTPPasswordMgrWithDefaultRealm() 把认证信息添加到密码管理器对象 pwdmg.add_password(None,webserver,user,passwd) 创建Handler处理器对象 私密代理 proxy = urllib.request.ProxyAuthBasicHandler(pwdmg) Web客户端 webbasic = urllib.request.HTTPBasicAuthHandler(pwdmg) # 创建Handler处理器对象 pro_hand = urllib.request.ProxyHandler(proxy) # 创建自定义opener对象 opener = urllib.request.build_opener(pro_hand) # opener对象open方法发请求 req = urllib.request.Request(url) res = opener.open(req) print(res.read().decode("utf-8")) 爬取猫眼电影排行榜存入MongoDB数据库 '''06_猫眼电影top100抓取.py''' import requests import re import pymongo class MaoyanSpider: def __init__(self): self.baseurl = "http://maoyan.com/board/4?offset=" self.headers = {"User-Agent":"Mozilla/5.0"} self.page = 1 self.offset = 0 self.proxies = {"http":"http://309435365:szayclhp@123.206.119.108:16817"} self.conn = pymongo.MongoClient("localhost",27017) self.db = self.conn.Film self.myset = self.db.top100 # 下载页面 def loadPage(self,url): res = requests.get(url,headers=self.headers) res.encoding = "utf-8" html = res.text self.parsePage(html) # 解析页面 def parsePage(self,html): p = re.compile('<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>',re.S) r_list = p.findall(html) # print(r_list) # [("霸王别姬","张国荣","1994-01-01"),(),()...] self.writeTomysql(r_list) def writeTomysql(self,r_list): for r_tuple in r_list: name = r_tuple[0].strip() star = r_tuple[1].strip() releasetime = r_tuple[2].strip() D = {"name":name, "star":star, "releasetime":releasetime} self.myset.insert(D) print("存入数据库成功") def workOn(self): while True: c = input("爬取请按y(y/n):") if c.strip().lower() == "y": self.offset = (self.page-1)*10 url = self.baseurl + str(self.offset) self.loadPage(url) self.page += 1 else: print("爬取结束,谢谢使用!") break if __name__ == "__main__": spider = MaoyanSpider() spider.workOn()

优秀的个人博客,低调大师

【Python】从0开始写爬虫——转身扒豆瓣电影

豆瓣就比较符合这个“明人不说暗话”的原则。所以我们扒豆瓣,不多说,直接上代码 from scrapy import app import re header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Host': 'movie.douban.com', 'Accept-Language': 'zh-CN,zh;q=0.9' } movie_url = "https://movie.douban.com/subject/26985127/?from=showing" m_id = re.search("[0-9]+", movie_url).group() # 获取soup对象 soup = app.get_soup(url=movie_url, headers=header, charset="utf-8") content = soup.find(id="content") # 抓取电影名字和上映年份 m_name = content.find("h1").find("span").string m_year = content.find(class_="year").string # 抓取导演 info = content.find(id="info") m_directer = info.find(attrs={"rel": "v:directedBy"}).string # 上映日期 m_date = info.find(attrs={"property": "v:initialReleaseDate"}).string # 类型 types = info.find_all(attrs={"property": "v:genre"}, limit=2) m_types = [] for type_ in types: m_types.append(type_.string) # 抓取主演,只取前面五个 actors = info.find(class_="actor").find_all(attrs={"rel": "v:starring"}, limit=5) m_actors = [] for actor in actors: m_actors.append(actor.string) # 片长 m_time = info.find(attrs={"property": "v:runtime"}).string # m_adaptor = info.select() print("id", m_id, "名称", m_name, "年份 ", m_year, "导演 ", m_directer, "主演", m_actors) print("上映日期", m_date, "类型", m_types, "片长", m_time) 输出: id 26985127 名称 一出好戏 年份 (2018) 导演 黄渤 主演 ['黄渤', '舒淇', '王宝强', '张艺兴', '于和伟'] 上映日期 2018-08-10(中国大陆) 类型 ['剧情', '喜剧'] 片长 134分钟 简单粗暴

优秀的个人博客,低调大师

Python爬虫(一)——开封市58同城租房信息

代码: 1 # coding=utf-8 2 import sys 3 import csv 4 import requests 5 from bs4 import BeautifulSoup 6 7 reload(sys) 8 sys.setdefaultencoding('utf-8') 9 # 请求头设置 10 11 def download(url): 12 db_data = requests.get(url) 13 soup = BeautifulSoup(db_data.text, 'lxml') 14 titles = soup.select( 15 'body > div.mainbox > div.main > div.content > div.listBox > ul > li > div.des > h2 > a:nth-of-type(1)') 16 houses = soup.select('body > div.mainbox > div.main > div.content > div.listBox > ul > li > div.des > p.room') 17 oneaddresss = soup.select( 18 'body > div.mainbox > div.main > div.content > div.listBox > ul > li > div.des > p.add > a:nth-of-type(1)') 19 twoaddresss = soup.select( 20 'body > div.mainbox > div.main > div.content > div.listBox > ul > li > div.des > p.add > a:nth-of-type(2)') 21 prices = soup.select( 22 'body > div.mainbox > div.main > div.content > div.listBox > ul > li > div.listliright > div.money > b') 23 for title, house, oneaddress, twoaddress, price in zip(titles, houses, oneaddresss, twoaddresss, prices): 24 data = [ 25 ( 26 str(title.string).replace(' ', '').replace('\n', ''), 27 house.get_text().split(' ')[0].replace(' ', '').replace("\n", ""), 28 house.get_text().split(' ')[-1].replace(' ', '').replace("\n", ""), 29 oneaddress.get_text().replace(' ', '').replace("\n", ""), 30 twoaddress.get_text().replace(' ', '').replace("\n", ""), 31 price.get_text().replace(' ', '').replace("\n", "") 32 ) 33 ] 34 35 csvfile = open('kf.csv', 'ab') 36 writer = csv.writer(csvfile) 37 print('write one house') 38 writer.writerows(data) 39 csvfile.close() 40 41 42 # 初始化csv文件 43 def info(): 44 csvinfo = open('kf.csv', 'ab') 45 begcsv = csv.writer(csvinfo) 46 begcsv.writerow(['title', 'house', 'area', 'address1', 'address2', 'price']) 47 csvinfo.close() 48 49 50 if __name__ == '__main__': 51 info() 52 download(url)

优秀的个人博客,低调大师

Python网络爬虫之HTTP的异常处理机制

一、URLError(URL错误异常) 通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),包含了一个错误号和一个错误信息。看下面的示例 URLError 从程序中可以看到输出为:[Errno 11004] getaddrinfo failed,也就是说,错误号是11004,内容是getaddrinfo failed 二、HTTPError(HTTPError状态错误) 服务器上每一个HTTP 应答对象response包含一个数字"状态码"。有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答。例如:假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理。其他不能处理的,urlopen会产生一个HTTPError。典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。HTTP状态码表示HTTP协议所返回的响应的状态。比如客户端向服务器发送请求,如果成功地获得请求的资源,则返回的状态码为200,表示响应成功。如果请求的资源不存在, 则通常返回404错误。 HTTP状态码通常分为5种类型,分别以1~5五个数字开头,由3位整数组成,如:200代表请求成功、304代表请求的资源未更新、400 代表非法请求,详情见HTTP状态码解析 HTTPError实例产生后会有一个整型'code'属性,是服务器发送的相关错误号。 Error Codes错误码:因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了HTTP协议使用的所有的应答号。当一个错误号产生后,服务器返回一个HTTP错误号,和一个错误页面。你可以使用HTTPError实例作为页面返回的应答对象response。这表示和错误属性一样,它同样包含了read,geturl,和info方法。 HTTPError 从程序中可以看到输出了404的错误码,也就说没有找到这个页面。 三、HTTP异常处理方式 HTTP异常处理方式 从示例中可以看到,两种方式都能输出异常:其中第二种中HTTPError必须写在URLError异常前,因HTTPError是URLError的子类,如果URLError在前面它会捕捉到所有的URLError(包括HTTPError )。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册