python爬虫笔记

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)是其中的第一条

 #另外一种正则匹配方法#regex = re.compile(r'<ol.*</ol>', re.S)                    #html = regex.search(text)#print('html.group():',html.group().encode("utf-8"))       #以utf-8格式查看全部的元素     
 

9.建立文件夹

 
import os
path = 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