1.截取目标字符串html
例如:string : <img src="/static/translation/img/translate/zonedword/loading_50c5e3e.gif" width= node
startpart : src="
endpart : "
return : /static/translation/img/translate/zonedword/loading_50c5e3e.gifpython
def findall_in_page(string, startpart, endpart): #string:字符串 #startpart:目标信息的前面部分 #endpart:目标信息的后面部分 point = 0 #指针 while string.find(startpart, point) != (-1): start = string.find(startpart, point) + len(startpart) point = string.find(endpart, start) return string[start:point]
2.转换正则表达式
label = urllib.parse.quote('中文') # 将中文转成ascii码,用于将中文关键词转为ascii码,构成url
json.loads(response.text) #字符串转换为字典
mylist = mylist[::-1] #将列表元素反向
3.访问连接json
(1)用request模块访问服务器
import requests r = requests.get(url).content #二进制编码 r.decode('utf-8') #utf-8编码 response.text等同于requests.get(url).content.decode('utf-8')
(2)用urllib模块访问多线程
import urllib
response = urllib.request.urlopen(new_url)
if response.getcode() == 200: #响应的HTTP状态代码,200(成功),服务器已成功处理了请求。
response.read().decode('utf-8') #response.read()返回一个html对象
response.close()
4.多线程app
import threading # 多线程 thread_lock = threading.BoundedSemaphore(value=10) # 设置最大线程锁 for url in pic_urls: thread_lock.acquire() # 上锁 t = threading.Thread(target=download_pics, args=(url, n)) t.start() def download_pics(urls, n): #耗时操做 thread_lock.release() # 解锁5.下载图片
r = requests.get(urls) path = 'pics\\'+str(n) + '.jpg' with open(path, 'wb') as f: f.write(r.content)
6.id标识函数
例如每一个微博都有本身的uid,根据uid构成的url去找所发的微博,所发的每条微博都有id,根据id构成的url去找下面的评论ui
7.过滤掉多余的标签
from lxml import html tree = html.fromstring(text) text = tree.xpath('string(.)') #用string函数过滤多余标签 (表情等)
8.解析页面
(1)bs4
from bs4 import BeautifulSoup import re #建立BeautifulSoup对象,用 html.parser 解析器,from_encoding是原始的编码方式 #soup = BeautifulSoup(open('index.html')) #index.html是本地的html文件 soup = BeautifulSoup(html_content, 'html.parser', from_encoding = 'utf-8') links = soup.find_all('a', href=re.compile(r'/view/\d+\.htm')) #找符合正则表达式的全部字符串 # 例如<dd class="lemmaWgt-lemmaTitle-title"> <h1>Python</h1>,找节点 title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title") title_node = title_node.find("h1") title_node.get_text() #或者title_node.string
(2)re
html = re.search(r'<ol.*</ol>', text, re.S) #正则匹配<ol>标签,返回匹配到的第一个。re.S:包括换行符在内的任意字符
urls_gif = re.finditer(r'org_src="(.+?)"',html.group(),re.I) #获得一个callable_iterator re.i:忽略大小写
#group()和group(0)是同样的,获得匹配的全部字符,groups()获得所有正则表达式部分的tuple,group(1)是其中的第一条
9.建立文件夹
import ospath = os.getcwd()+r'\Image'+str(time.time()) if not os.path.exists(path): os.mkdir(path)
10.协程
import gevent from gevent import monkey import urllib.request import time monkey.patch_all() jobs = [] for i in pageurl: for (downurl) in geturllist(i): #downurl参数传给download函数,gevent是第三方库,实际上是经过greenlet实现协程 g = gevent.spawn(download, downurl) #获得 Greenlet 对象 jobs.append(g) gevent.joinall(jobs) def download(down_url): ''' 接收图片的下载连接,下载并保存到本地,会遇到10060错误 down_url : 下载连接 ''' name=str(time.time())[:-3]+"_"+re.sub('.+/','',down_url) try: urllib.request.urlretrieve(down_url, path+"\\"+name) #urllib.request.urlretrieve(down_url, path+"\\"+name,schedule) except urllib.error.URLError as e: print(e.reason) except urllib.error.URLError as e: print(e.reason) #显示下载进度 def schedule(a,b,c): '''urlretrieve的回调函数 a : 已经下载的数据块 b : 数据块的大小 c : 远程文件的大小 ''' per = 100.0 * a * b / c if per > 100 : per = 100 print('%.2f%%' % per)
参考网址
10060错误 : http://blog.csdn.net/wetest_tencent/article/details/51272981WinError
10054 : http://blog.csdn.net/illegalname/article/details/77164521
正则表达式:http://www.runoob.com/regexp/regexp-syntax.html
urllib.request.urlretrieve : http://www.nowamagic.net/academy/detail/1302861