이 문서의 내용은 Python 크롤러가 get(코드 포함)에서 요청한 페이지 데이터를 크롤링하는 방법에 대한 것입니다. 이는 특정 참조 값을 가지고 있으므로 도움이 될 수 있습니다.
一.urllib library
urllib는 Python과 함께 제공되는 크롤러용 라이브러리입니다. 주요 기능은 코드를 통해 요청을 보내는 브라우저를 시뮬레이션하는 것입니다. 일반적으로 사용되는 하위 모듈은 Python3의 urllib.request 및 urllib.parse이고 Python2의 urllib 및 urllib2입니다.
2. 쉬운 것부터 어려운 것까지:
1. Baidu 홈페이지의 모든 데이터 값을 크롤링합니다.
#!/usr/bin/env python # -*- coding:utf-8 -*- #导包 import urllib.request import urllib.parse if __name__ == "__main__": #指定爬取的网页url url = 'http://www.baidu.com/' #通过urlopen函数向指定的url发起请求,返回响应对象 reponse = urllib.request.urlopen(url=url) #通过调用响应对象中的read函数,返回响应回客户端的数据值(爬取到的数据) data = reponse.read()#返回的数据为byte类型,并非字符串 print(data)#打印显示爬取到的数据值。
#보충 설명
urlopen 함수 프로토타입:
urllib.request.urlopen(url, data=None, timeout=<object object at 0x10af327d0>, *, cafile=None, capath=None, cadefault=False, context=None)
위의 경우에만 사용했습니다. 이 함수는 URL의 첫 번째 매개변수입니다. 일상적인 개발에서 우리가 사용할 수 있는 유일한 두 가지 매개변수는 url과 data입니다.
url 매개변수: 요청을 시작할 URL을
에 지정합니다. data 매개변수: 게시물 요청에 포함된 매개변수를 사전에 캡슐화하여 이 매개변수에 전달할 수 있습니다(지금은 이해할 필요가 없습니다. 나중에)
urlopen 함수 개체에 의해 반환된 응답, 관련 함수 호출 소개:
response.headers(): 응답 헤더 정보 가져오기
response.getcode(): 응답 상태 코드 가져오기
response.geturl(): 요청한 URL 가져오기
response.read():
2에서 응답 데이터 값(바이트 유형)을 가져옵니다. Baidu News 홈페이지에 크롤링된 데이터 값을 저장용 파일에 씁니다.
#!/usr/bin/env python # -*- coding:utf-8 -*- import urllib.request import urllib.parse if __name__ == "__main__": url = 'http://news.baidu.com/' reponse = urllib.request.urlopen(url=url) #decode()作用是将响应中字节(byte)类型的数据值转成字符串类型 data = reponse.read().decode() #使用IO操作将data表示的数据值以'w'权限的方式写入到news.html文件中 with open('./news.html','w') as fp: fp.write(data) print('写入文件完毕')
3.
#!/usr/bin/env python # -*- coding:utf-8 -*- import urllib.request import urllib.parse #如下两行代码表示忽略https证书,因为下面请求的url为https协议的请求,如果请求不是https则该两行代码可不用。 import ssl ssl._create_default_https_context = ssl._create_unverified_context if __name__ == "__main__": #url是https协议的 url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536918978042&di=172c5a4583ca1d17a1a49dba2914cfb9&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0dd7912397dda144f04b5d9cb9b7d0a20cf48659.jpg' reponse = urllib.request.urlopen(url=url) data = reponse.read()#因为爬取的是图片数据值(二进制数据),则无需使用decode进行类型转换。 with open('./money.jpg','wb') as fp: fp.write(data) print('写入文件完毕')
4 .url의 특징: URL은 ASCII로 인코딩된 데이터 값이어야 합니다. 따라서 크롤러 코드에 URL을 작성할 때 URL에 ASCII가 아닌 인코딩된 데이터 값이 있는 경우 URL을 사용하려면 먼저 ASCII로 인코딩되어야 합니다.
사례: 지정된 용어를 기반으로 Baidu에서 검색한 페이지 데이터를 크롤링합니다(예: 'Jay Chou'라는 용어가 포함된 페이지 데이터를 크롤링)
#!/usr/bin/env python # -*- coding:utf-8 -*- import urllib.request import urllib.parse if __name__ == "__main__": #原始url中存在非ASCII编码的值,则该url无法被使用。 #url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦' #处理url中存在的非ASCII数据值 url = 'http://www.baidu.com/s?' #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数 param = { 'ie':'utf-8', 'wd':'周杰伦' } #使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码 param = urllib.parse.urlencode(param) #将编码后的数据和url进行整合拼接成一个完整可用的url url = url + param print(url) response = urllib.request.urlopen(url=url) data = response.read() with open('./周杰伦.html','wb') as fp: fp.write(data) print('写入文件完毕')
5. 크롤러 프로그램에서 요청한 ID를 위장하도록 요청 개체를 맞춤설정합니다. .
앞에서 일반적인 http 요청 헤더 정보를 설명할 때 UA라고 하는 User-Agent 매개변수에 대해 설명했습니다. 이 매개변수의 기능은 요청 캐리어의 ID를 나타내는 것입니다. 브라우저를 통해 요청을 시작하는 경우 요청의 전달자는 현재 브라우저이고 UA 매개변수의 값은 현재 브라우저의 ID로 표시되는 데이터 문자열을 나타냅니다. 크롤러 프로그램에 의해 시작된 요청을 사용하는 경우 요청 전달자는 크롤러 프로그램이고 요청의 UA는 크롤러 프로그램의 ID로 표시되는 데이터 문자열입니다. 일부 웹사이트에서는 요청의 UA를 식별하여 요청 전달자가 크롤러 프로그램인지 여부를 결정합니다. 크롤러 프로그램인 경우 요청에 대한 응답이 반환되지 않으며 당사의 크롤러 프로그램은 웹사이트를 크롤링할 수 없습니다. 데이터 값을 통해 이는 크롤링 방지의 주요 기술 수단이기도 합니다. 이러한 문제가 발생하는 것을 방지하기 위해 크롤러 프로그램의 UA를 특정 브라우저의 ID로 위장할 수 있습니다.
위의 경우 요청 모듈에서 urlopen을 통해 요청을 시작했습니다. 요청 개체는 urllib에 내장된 기본 요청 개체이므로 UA를 통해 변경할 수 없습니다. urllib는 요청 객체를 사용자 정의하는 방법도 제공합니다. 요청 객체를 사용자 정의하여 요청 객체에서 UA를 위장(변경)할 수 있습니다.
#!/usr/bin/env python # -*- coding:utf-8 -*- import urllib.request import urllib.parse import ssl ssl._create_default_https_context = ssl._create_unverified_context if __name__ == "__main__": #原始url中存在非ASCII编码的值,则该url无法被使用。 #url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦' #处理url中存在的非ASCII数据值 url = 'http://www.baidu.com/s?' #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数 param = { 'ie':'utf-8', 'wd':'周杰伦' } #使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码 param = urllib.parse.urlencode(param) #将编码后的数据和url进行整合拼接成一个完整可用的url url = url + param #将浏览器的UA数据获取,封装到一个字典中。该UA值可以通过抓包工具或者浏览器自带的开发者工具中获取某请求,从中获取UA的值 headers={ 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' } #自定义一个请求对象 #参数:url为请求的url。headers为UA的值。data为post请求的请求参数(后面讲) request = urllib.request.Request(url=url,headers=headers) #发送我们自定义的请求(该请求的UA已经进行了伪装) response = urllib.request.urlopen(request) data=response.read() with open('./周杰伦.html','wb') as fp: fp.write(data) print('写入数据完毕')
관련 권장 사항:
Zhihu 단일 페이지를 크롤링하는 Python 크롤러 베타 버전
위 내용은 Python 크롤러는 get에서 요청한 페이지 데이터를 어떻게 크롤링합니까? (코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!