python爬虫完整代码(Python简单的爬虫代码)

http://www.itjxue.com  2023-02-01 10:11  来源:未知  点击次数: 

python 爬虫

验证码(CAPTCHA)全称为全自动区分计算机和人类的公开图灵测试(Completely Automated Public Turing test to tell Computersand Humans Apart)。从其全称可以看出,验证码用于测试用户是真实的人类还是计算机机器人。

1.获得验证码图片

每次加载注册网页都会显示不同的验证验图像,为了了解表单需要哪些参数,我们可以复用上一章编写的parse_form()函数。

import cookielib,urllib2,pprint import form REGISTER_URL = '' cj=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) html=opener.open(REGISTER_URL).read() form=form.parse_form(html) pprint.pprint(form)

{'_formkey': 'a67cbc84-f291-4ecd-9c2c-93937faca2e2', '_formname': 'register', '_next': '/places/default/index', 'email': '', 'first_name': '', 'last_name': '', 'password': '', 'password_two': '', 'recaptcha_response_field': None} 123456789101112131415161718

上面recaptcha_response_field是存储验证码的值,其值可以用Pillow从验证码图像获取出来。先安装pip install Pillow,其它安装Pillow的方法可以参考 。Pillow提价了一个便捷的Image类,其中包含了很多用于处理验证码图像的高级方法。下面的函数使用注册页的HTML作为输入参数,返回包含验证码图像的Image对象。

import lxml.html from io import BytesIO from PIL import Image tree=lxml.html.fromstring(html) print tree

Element html at 0x7f8b006ba890 img_data_all=tree.cssselect('div#recaptcha img')[0].get('src') print img_data_all

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABgCAIAAAB9kzvfAACAtklEQVR4nO29Z5gcZ5ku3F2dc865

...

rkJggg== img_data=img_data_all.partition(',')[2] print img_data

iVBORw0KGgoAAAANSUhEUgAAAQAAAABgCAIAAAB9kzvfAACAtklEQVR4nO29Z5gcZ5ku3F2dc865

...

rkJggg== binary_img_data=img_data.decode('base64') file_like=BytesIO(binary_img_data) print file_like

_io.BytesIO object at 0x7f8aff6736b0 img=Image.open(file_like) print img

PIL.PngImagePlugin.PngImageFile image mode=RGB size=256x96 at 0x7F8AFF5FAC90 12345678910111213141516171819202122232425

在本例中,这是一张进行了Base64编码的PNG图像,这种格式会使用ASCII编码表示二进制数据。我们可以通过在第一个逗号处分割的方法移除该前缀。然后,使用Base64解码图像数据,回到最初的二进制格式。要想加载图像,PIL需要一个类似文件的接口,所以在传给Image类之前,我们以使用了BytesIO对这个二进制数据进行了封装。

完整代码:

# -*- coding: utf-8 -*-form.pyimport urllibimport urllib2import cookielibfrom io import BytesIOimport lxml.htmlfrom PIL import Image

REGISTER_URL = ''#REGISTER_URL = ''def extract_image(html):

tree = lxml.html.fromstring(html)

img_data = tree.cssselect('div#recaptcha img')[0].get('src') # remove data:image/png;base64, header

img_data = img_data.partition(',')[-1] #open('test_.png', 'wb').write(data.decode('base64'))

binary_img_data = img_data.decode('base64')

file_like = BytesIO(binary_img_data)

img = Image.open(file_like) #img.save('test.png')

return imgdef parse_form(html):

"""extract all input properties from the form

"""

tree = lxml.html.fromstring(html)

data = {} for e in tree.cssselect('form input'): if e.get('name'):

data[e.get('name')] = e.get('value') return datadef register(first_name, last_name, email, password, captcha_fn):

cj = cookielib.CookieJar()

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

html = opener.open(REGISTER_URL).read()

form = parse_form(html)

form['first_name'] = first_name

form['last_name'] = last_name

form['email'] = email

form['password'] = form['password_two'] = password

img = extract_image(html)#

captcha = captcha_fn(img)#

form['recaptcha_response_field'] = captcha

encoded_data = urllib.urlencode(form)

request = urllib2.Request(REGISTER_URL, encoded_data)

response = opener.open(request)

success = '/user/register' not in response.geturl() #success = '/places/default/user/register' not in response.geturl()

return success12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

2.光学字符识别验证码

光学字符识别(Optical Character Recognition, OCR)用于图像中抽取文本。本节中,我们将使用开源的Tesseract OCR引擎,该引擎最初由惠普公司开发的,目前由Google主导。Tesseract的安装说明可以从 获取。然后可以使用pip安装其Python封装版本pytesseractpip install pytesseract。

下面我们用光学字符识别图像验证码:

import pytesseract import form img=form.extract_image(html) pytesseract.image_to_string(img)'' 123456

如果直接把验证码原始图像传给pytesseract,一般不能解析出来。这是因为Tesseract是抽取更加典型的文本,比如背景统一的书页。下面我们进行去除背景噪音,只保留文本部分。验证码文本一般都是黑色的,背景则会更加明亮,所以我们可以通过检查是否为黑色将文本分离出来,该处理过程又被称为阈值化。

img.save('2captcha_1original.png') gray=img.convert('L') gray.save('2captcha_2gray.png') bw=gray.point(lambda x:0 if x1 else 255,'1') bw.save('2captcha_3thresholded.png') 1234567

这里只有阈值小于1的像素(全黑)都会保留下来,分别得到三张图像:原始验证码图像、转换后的灰度图和阈值化处理后的黑白图像。最后我们将阈值化处理后黑白图像再进行Tesseract处理,验证码中的文字已经被成功抽取出来了。

pytesseract.image_to_string(bw)'language' import Image,pytesseract img=Image.open('2captcha_3thresholded.png') pytesseract.image_to_string(img)'language' 123456789

我们通过示例样本测试,100张验证码能正确识别出90张。

import ocr ocr.test_samples()

Accuracy: 90/100 1234

下面是注册账号完整代码:

# -*- coding: utf-8 -*-import csvimport stringfrom PIL import Imageimport pytesseractfrom form import registerdef main():

print register('Wu1', 'Being1', 'Wu_Being001@qq.com', 'example', ocr)def ocr(img):

# threshold the image to ignore background and keep text

gray = img.convert('L') #gray.save('captcha_greyscale.png')

bw = gray.point(lambda x: 0 if x 1 else 255, '1') #bw.save('captcha_threshold.png')

word = pytesseract.image_to_string(bw)

ascii_word = ''.join(c for c in word if c in string.letters).lower() return ascii_wordif __name__ == '__main__':

main()1234567891011121314151617181920212223

我们可以进一步改善OCR性能:

- 实验不同阈值

- 腐蚀阈值文本,突出字符形状

- 调整图像大小

- 根据验证码字体训练ORC工具

- 限制结果为字典单词

python爬虫源代码没有但检查

python爬虫源代码没有但检查可以通过5个步骤进行解决。

1、提取列车Code和No信息。

2、找到url规律,根据Code和No变化实现多个网页数据爬取。

3、使用PhantomJS模拟浏览器爬取源代码。

4、用bs4解析源代码,获取所需的途径站数据。

5、用csv库存储获得的数据。

python 爬虫(学了3天写出的代码)

import requests import parsel import threading,os import queue

class Thread(threading.Thread): def init (self,queue,path): threading.Thread. init (self) self.queue = queue self.path = path

def download_novel(url, path): res = get_response(url) selctor = parsel.Selector(res) title = selctor.css('.bookname h1::text').get() print(title) content = ' '.join(selctor.css('#content::text').getall()) # 使用join方法改变内容; with open( path + title + ".txt","w",encoding='utf-8') as f: f.write(content) print(title,'保存成功!') f.close()

def get_response(url): # 获得网站源码; response = requests.get(url) response.encoding = 'utf-8' return response.text

if name == ' main ': # 函数入口 url = str(input('请输入你要下载小说的url:')) response = get_response(url) sel = parsel.Selector(response) novelname = sel.css('#info h1::text').get() urllist = sel.css('.box_con p dl dd a::attr(href)').getall() queue = queue.Queue() path = './{}/'.format(novelname)

Python爬虫:想听榜单歌曲?只需要14行代码即可搞定

虽然说XPath比正则表达式用起来方便,但是没有最方便,只有更方便。我们的BeautifulSoup库就能做到更方便的爬取想要的东西。

使用之前,还是老规矩,先安装BeautifulSoup库,指令如下:

其中文开发文档:

BeautifulSoup库是一个强大的Python语言的XML和HTML解析库。它提供了一些简单的函数来处理导航、搜索、修改分析树等功能。

BeautifulSoup库还能自动将输入的文档转换为Unicode编码,输出文档转换为UTF-8编码。

所以,在使用BeautifulSoup库的过程中,不需要开发中考虑编码的问题,除非你解析的文档,本身就没有指定编码方式,这才需要开发中进行编码处理。

下面,我们来详细介绍BeautifulSoup库的使用规则。

下面,我们来详细介绍BeautifulSoup库的重点知识。

首先,BeautifulSoup库中一个重要的概念就是选择解释器。因为其底层依赖的全是这些解释器,我们有必要认识一下。博主专门列出了一个表格:

从上面表格观察,我们一般爬虫使用lxml HTML解析器即可,不仅速度快,而且兼容性强大,只是需要安装C语言库这一个缺点(不能叫缺点,应该叫麻烦)。

要使用BeautifulSoup库,需要和其他库一样进行导入,但你虽然安装的是beautifulsoup4,但导入的名称并不是beautifulsoup4,而是bs4。用法如下:

运行之后,输出文本如下:

基础的用法很简单,这里不在赘述。从现在开始,我们来详细学习BeautifulSoup库的所有重要知识点,第一个就是节点选择器。

所谓节点选择器,就是直接通过节点的名称选择节点,然后再用string属性就可以得到节点内的文本,这种方式获取最快。

比如,基础用法中,我们使用h1直接获取了h1节点,然后通过h1.string即可得到它的文本。但这种用法有一个明显的缺点,就是层次复杂不适合。

所以,我们在使用节点选择器之前,需要将文档缩小。比如一个文档很多很大,但我们获取的内容只在id为blog的p中,那么我们先获取这个p,再在p内部使用节点选择器就非常合适了。

HTML示例代码:

下面的一些示例,我们还是使用这个HTML代码进行节点选择器的讲解。

这里,我们先来教会大家如何获取节点的名称属性以及内容,示例如下:

运行之后,效果如下:

一般来说一个节点的子节点有可能很多,通过上面的方式获取,只能得到第一个。如果要获取一个标签的所有子节点,这里有2种方式。先来看代码:

运行之后,效果如下:

如上面代码所示,我们有2种方式获取所有子节点,一种是通过contents属性,一种是通过children属性,2者遍历的结果都是一样的。

既然能获取直接子节点,那么获取所有子孙节点也是肯定可以的。BeautifulSoup库给我们提供了descendants属性获取子孙节点,示例如下:

运行之后,效果如下:

同样的,在实际的爬虫程序中,我们有时候也需要通过逆向查找父节点,或者查找兄弟节点。

BeautifulSoup库,给我们提供了parent属性获取父节点,同时提供了next_sibling属性获取当前节点的下一个兄弟节点,previous_sibling属性获取上一个兄弟节点。

示例代码如下:

运行之后,效果如下:

对于节点选择器,博主已经介绍了相对于文本内容较少的完全可以这么做。但实际的爬虫爬的网址都是大量的数据,开始使用节点选择器就不合适了。所以,我们要考虑通过方法选择器进行先一步的处理。

find_all()方法主要用于根据节点的名称、属性、文本内容等选择所有符合要求的节点。其完整的定义如下所示:

【实战】还是测试上面的HTML,我们获取name=a,attr={"class":"aaa"},并且文本等于text="Python板块"板块的节点。

示例代码如下所示:

运行之后,效果如下所示:

find()与find_all()仅差一个all,但结果却有2点不同:

1.find()只查找符合条件的第一个节点,而find_all()是查找符合条件的所有节点2.find()方法返回的是bs4.element.Tag对象,而find_all()返回的是bs4.element.ResultSet对象

下面,我们来查找上面HTML中的a标签,看看返回结果有何不同,示例如下:

运行之后,效果如下:

首先,我们来了解一下CSS选择器的规则:

1..classname:选取样式名为classname的节点,也就是class属性值是classname的节点2.#idname:选取id属性为idname的节点3.nodename:选取节点名为nodename的节点

一般来说,在BeautifulSoup库中,我们使用函数select()进行CSS选择器的操作。示例如下:

这里,我们选择class等于li1的节点。运行之后,效果如下:

因为,我们需要实现嵌套CSS选择器的用法,但上面的HTML不合适。这里,我们略作修改,仅仅更改

用python爬取关键词并解释

Copyright ? 1999-2020, CSDN.NET, All Rights Reserved

python

打开APP

小羊努力搞代码

关注

学习日志:Python 实现网络爬虫——提取关键字 原创

2022-06-19 13:02:38

小羊努力搞代码

码龄174天

关注

编写一段Python代码,向百度提交查询关键词“桃花源记”,抓取百度的查询结果,要求有文字、链接,可以在浏览器中打开抓取的链接,或者调用浏览器打开抓取的链接。

红框内是根据网站信息需要更改的内容。57031baa3a394395be479ad89f1ff15e.png

附上完整代码:

import json

import requests

from lxml import etree

headers = {

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "

"Chrome/88.0.4324.104 Safari/537.36"

}

response = requests.get('桃花源记lm=0', headers=headers)

r = response.text

html = etree.HTML(r, etree.HTMLParser())

r1 = html.xpath('//h3')

r2 = html.xpath('//*[@class="content-right_8Zs40"]')

r3 = html.xpath('//*[@class="c-row source_1Vdff OP_LOG_LINK c-gap-top-xsmall"]/a/@href')

for i in range(4):

r11 = r1[i].xpath('string(.)')

r22 = r2[i].xpath('string(.)')

r33 = r3[i]

with open('桃花源记.txt', 'a', encoding='utf-8') as c:

c.write(json.dumps(r11,ensure_ascii=False) + '\n')

c.write(json.dumps(r22, ensure_ascii=False) + '\n')

c.write(json.dumps(r33, ensure_ascii=False) + '\n')

print(r11, end='\n')

print('------------------------')

print(r22, end='\n')

print(r33)

(责任编辑:IT教学网)

更多

推荐Flash动画文章