目录css
import threading import requests from lxml import etree from urllib import request import os import re from queue import Queue class HtmlSprider(threading.Thread): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36' } def __init__(self,page_queue,img_queue,*args,**kwargs): super(HtmlSprider, self).__init__(*args,**kwargs) self.page_queue = page_queue self.img_queue = img_queue def run(self): while True: if self.page_queue.empty(): break url = self.page_queue.get() self.parse_page(url) def parse_page(self,url): response = requests.get(url,headers=self.headers) text = response.text html = etree.HTML(text) imgs = html.xpath("//div[@class='page-content text-center']//a//img") for img in imgs: if img.get('class') == 'gif': continue img_url = img.xpath(".//@data-original")[0] suffix = os.path.splitext(img_url)[1] suffix = re.sub(r"!dta", "", suffix) alt = img.xpath(".//@alt")[0] alt = re.sub(r'[,。??,/\\·]','',alt) img_name = alt + suffix self.img_queue.put((img_url,img_name)) class DownloadPicture(threading.Thread): def __init__(self,page_queue,img_queue,*args,**kwargs): super(DownloadPicture, self).__init__(*args,**kwargs) self.page_queue = page_queue self.img_queue = img_queue def run(self): while True: if self.img_queue.empty(): if self.page_queue.empty(): return img = self.img_queue.get(block=True) url,filename = img request.urlretrieve(url,'images/'+filename) print(filename+' 下载完成!') def main(): page_queue = Queue(100) img_queue = Queue(500) for x in range(1,10): url = "http://www.doutula.com/photo/list/?page=%d" % x page_queue.put(url) for x in range(5): t = HtmlSprider(page_queue,img_queue) t.start() for x in range(5): t = DownloadPicture(page_queue,img_queue) t.start() if __name__ == '__main__': main()
AJAX(Asynchronouse JavaScript And XML)
,翻译为异步JavaScript和XML。是在后台与服务器进行少许数据交换,Ajax 能够使网页实现异步更新。这意味着能够在不从新加载整个网页的状况下,对网页的某部分进行更新。咱们有两种办法来处理这种状况:html
selenium
和chromedriver
来模拟登录。这样虽然繁琐,不过很稳定。Selenium
至关因而一个机器人。能够模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,好比点击,填充数据,删除cookie
等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才能够驱动浏览器。selenium
快速入门与基本操做selenium文档官网python
from selenium import webdriver import time driver_path = "D:\\chromedriver\\chromedriver.exe" ##获取chromedriver可执行文件的地址 inputTag = webdriver.Chrome(executable_path=driver_path) ##传入chromedriver地址 inputTag.get("http://www.baidu.com") ##访问页面 inputTag = inputTag.find_element_by_id("kw") inputTag.send_keys("python") time.sleep(4)
driver.close()
:关闭当前页面driver.quit()
:退出浏览器find_element_by_id
:根据id来查找元素find_element_by_class_name
:根据类名查找元素find_element_by_name
:根据name属性的值来查找元素find_element_by_tag_name
:根据标签名来查找元素find_element_by_xpath
:根据xpath语法来获取元素find_element_by_css_selector
:根据css选择器选择元素注意:把以上方法中的element
改成elements
就能够获取全部相关元素了git
#1.先获取须要填写内容的表单 #2.用send_keys方法发送要输入的值 inputTag = driver.find_element_by_id("kw") inputTag.send_keys("python")
inputTag.clear()
rememberTag = driver.find_element_by_name("rememberMe") rememberTag.click()
click_and_hold(element)
:点击但不松开鼠标context_click(element)
:右键点击double_click(element)
:双击inputTag = driver.find_element_by_id('kw') submitTag = driver.find_element_by_id('su') ## 咱们能够使用鼠标行为链类ActionChains来完成 actions = ActionChains(driver) actions.move_to_element(inputTag) actions.send_keys_to_element(inputTag,'python') actions.move_to_element(submitTag) actions.click(submitTag) actions.perform()
Cookie
操做for cookie in driver.get_cookies(): print(cookie
value = driver.get_cookie(key)
driver.delete_all_cookies()
driver.delete_cookie(key)
如今的网页愈来愈多采用了 Ajax 技术,这样程序便不能肯定什么时候某个元素彻底加载出来了。若是实际页面等待时间过长致使某个dom元素还没出来,可是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。所以,selenium提供了如下两种解决办法:github
driver = webdriver.Chrome(executable_path=driver_path) driver.implicitly_wait(10) # 请求网页 driver.get("https://www.baidu.com/")
显示等待是代表某个条件成立后才执行获取元素的操做。也能够在等待的时候指定一个最大的时间,若是超过这个时间那么就抛出一个异常。web
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit()
一些其余的等待条件:ajax
presence_of_element_located
:某个元素已经加载完毕presence_of_all_element_located
:网页中全部知足条件的元素都加载完毕了element_to_be_cliable
:某个元素能够点击了from selenium import webdriver driver_path = r"D:\chromedriver\chromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) driver.get("https://baidu.com/") ##打开新的一个页面 driver.execute_script("window.open('http://www.douban.com/')") ##切换到这个新的页面中 driver.driver.switch_to.window(driver.window_handles[1])
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument("--proxy-server=http://110.52.235.241:9999") driver_path = r"D:\chromedriver\chromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path,options=options) driver.get("http://www.ip138.com/")
tesseract
tesseract
安装与配置GIT官网chrome
在Windows下把tesseract.exe所在的路径添加到PATH环境变量中。还有一个环境变量须要设置的是,要把训练的数据文件路径也放到环境变量中。在环境变量中,添加一个TESSDATA_PREFIX=C:\path_to_tesseractdata\teseractdata。浏览器
tesseract 图片路径 文件路径
文件路径不须要添加后缀名也会默认为.txt
服务器
import pytesseract from PIL import Image ##得到tesseract可执行文件地址 pytesseract.pytesseract.tesseract_cmd = r"D:\tesseract\tesseract.exe" ##利用该模块打开图片文件 image = Image.open(r"C:\Users\DELL\Desktop\a.png") ##image_to_string()方法转换成字符串 text = pytesseract.image_to_string(image) print(text)