предисловие
На самом деле в большинстве случаев собственные urllib и re регулярные выражения python уже могут удовлетворить наши повседневные нужды, но как умный мир может довольствоваться этим, только лучше не лучше. Таким образом, родилась золотая комбинация запросов и красивого супа в виде рептилий. И прелесть python именно в этом, можно найти множество сторонних библиотек, которые просты в использовании и просты в использовании, чтобы сердце трепетало.
1. Установка и простота использования.
1. Установка
Его легко установить с помощью Pip:
pip install requests
pip install beautifulsoup4
2. Начало работы с запросами.
import requests
## get请求
r = requests.get('https://github.com/timeline.json')
r.json() ##如果是JSON 响应内容,使用r.json()会自动将json结果转换成dict
r.content() ##二进制相应内容
headers = {'user-agent': 'my-app/0.0.1'} #定制请求头
r = requests.get('https://github.com/timeline.json', headers=headers)
payload = {'key1': 'value1', 'key2': 'value2'} #传递url参数
r = requests.get("http://httpbin.org/get", params=payload)
## post请求
payload = {'key1': 'value1', 'key2': 'value2'} ## post数据
r = requests.post("http://httpbin.org/post", data=payload)
## 上传文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
Для получения более подробной информации, пожалуйста, проверьте официальныйкитайский документ, подробный и простой для понимания орган.
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
3. Начало работы с BeautifulSoup.
BeautifulSoup может быстро находить HTML-документы, HTML — это своего рода описание веб-страниц.Язык гипертекстовой разметки, а не язык программирования. Если у вас нет основ HTML, вы можете потратить на его изучение целый день.Учебник для новичков — HTML
http://www.runoob.com/html/html-tutorial.html
Примечания
-
Теперь предположим, что вы знаете, что такое HTML, вы обнаружите, что HTML состоит из слоев тегов, каждый узел тега имеет свой собственный атрибут класса или другие атрибуты, свой собственный родительский тег, дочерний тег и родственный тег, в то время как BeautifulSoup Его роль состоит в том, чтобы легко Найдите убийцу, которого вы хотите, с помощью таких подсказок. . О, не узнать целевой узел, избавив от утомительного кошмара написания регулярных выражений.
-
Интерпретация HTML в Beautifulsoup опирается на сторонние библиотеки интерпретации. Обычно используются html.parser, lxml, lxml-xml, поддерживающая интерпретацию xml, и html5Lib, каждая из которых имеет свои преимущества и недостатки. используется отложенная обработка, возвращаемая BeautifulSoup. В тексте будут отсутствовать некоторые узлы тегов, но если вы уверены, что это не динамическая загрузка, то на самом деле это происходит потому, что интерпретатор не может его интерпретировать и пропускает напрямую. В это время вы можно попробовать сменить интерпретатор.
Часто используемые методы
Здесь я использую find и find_all только в качестве примеров.официальная документация. Ведь быть носильщиком утомительно и бессмысленно.
http://beautifulsoup.readthedocs.io/zh_CN/latest/
from bs4 import BeautifulSoup
##配合requests
r = requests.get('http://www.douban.com')
##一锅待处理的soup汤
soup = BeautifulSoup(r.content,'lxml') #使用lxml解释库
print(soup)
Мы получим следующее суповое тело, а затем найдем блок a в красной рамке.
Найти узел по расположению атрибута (найти)
a = soup.find('a',attrs={'class':'lnk-book'})
print(a)
print('链接: '+a['href'])
print('文字: '+a.text)
Возвращает список, содержащий все узлы (find_all)
a_s = soup.find_all('a')
print (a_s)
Совет: иногда необходимо уменьшать целевой диапазон слой за слоем, чтобы можно было легко получить целевой узел.
2. Crawling Douban Books top250
Страница анализа.
1. Когда мы щелкнем номер страницы внизу, мы обнаружим, что количество страниц кратно 25, начиная с 0, так что мы можем создать URL-адрес соответствующей страницы.
2. Мы находим каждую страницу, находим информацию о книге и получаем соответствующий URL-адрес. На следующем рисунке показан URL-адрес страницы сведений о книге, просканированный с каждой страницы.
3. На странице сведений о книге мы находим следующие элементы. Получите название, рейтинг и количество людей, которые оценили книгу.
написание кода
# -*- coding:utf-8 -*-
#author:waiwen
#email:iwaiwen@163.com
#time: 2017/12/3 12:27
from bs4 import BeautifulSoup
import requests
import random
#uer_agent库,随机选取,防止被禁
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
#请求网页的代码整合
def get_response(url):
#random.choice从一个集合中随机选出请求头
headers = {'user-agent':random.choice(USER_AGENT_LIST)}
resp = requests.get(url,headers=headers)
resp.raise_for_status()
soup = BeautifulSoup(resp.content, 'lxml')
return soup
#找到每本书的链接
def get_book_url(page):
if page>10:
return []
num=(page-1)*25
url ='https://book.douban.com/top250?start=%s'%str(num)
soup = get_response(url)
book_div = soup.find('div', attrs={'class': 'indent'})
books = book_div.find_all('tr', attrs={'class': 'item'})
urls = [ book.td.a['href'] for book in books ]
print('获取第%s页'%page,urls)
return urls
#获得每本书的信息
def get_book_info(book_url):
soup = get_response(book_url)
div_info = soup.find('div',attrs={'id':'info'})
book_author = div_info.a.text.split(' ')[-1] #将空格去除
book = soup.find('div',attrs={'class':'rating_wrap clearbox'})
book_name= soup.find('span',attrs={'property':'v:itemreviewed'}).text
book_grade = book.find('strong',attrs={'class':'ll rating_num '}).text
book_man = book.find('a',attrs={'class':'rating_people'}).span.text
book_info ={}
book_info['name']=book_name
book_info['author']=book_author
book_info['rating_num'] = int(book_man)
book_info['grade'] = float(book_grade)
print(book_info)
return book_info
if __name__ == '__main__':
all_urls = []
#从第1页到第10页爬取,链接拼接到一起。
for page in range(1,11):
urls = get_book_url(page)
all_urls = all_urls+urls
print('获取到的链接数:',len(all_urls))
out=''
for url in all_urls:
try:
info = get_book_info(url)
except Exception as e:
print(e)
continue
out=out+str(info)+'\n'
with open('douban_book_top250.txt','w') as f: #输出到TXT文件
f.write(out)
Суммировать
Проанализируйте страницу, найдите узел тега, в котором находится целевой элемент, запишите его атрибуты, найдите область с помощью find и find_all в BeautifulSoup, а затем извлеките соответственно. В этом процессе необходимо объяснить, что использование однопоточной блокировки для обхода информации 250 книг занимает много времени, в дальнейшем планируется использовать многопоточность для ее улучшения, так что следите за обновлениями.