python爬虫


一:爬虫类型
定向:指定网站爬取
非定向:仍意网站爬取
二:简单流程
下载网页
requests模块
筛选特定标签
beautfulsoup/正则表达式
三:BeautifulSoup模块介绍
1.name属性,标签名称
soup=BeautifulSoup(html_doc,features='lxml') # t1=soup.find(id='xml') # print(t1.name) # t1.name='div'#修改标签 # print(soup)
2.attr属性,获取标签的所有标签属性,类型字典
# t2=soup.find(name='p')
# print(t2.attrs)#查看该标签的所有属性
# print(t2.attrs.get('id'))
# t2.attrs={'name':'first','id':'irving'}#修改该标签的属性
# print(soup)
# t2.attrs['id']='curry'
# print(soup)
3.children,所有子标签
#children属性,获取所有的孩子标签
# from bs4.element import Tag
# t3=soup.find('div')
# print(list(t3.children))
# for item in t3:
# if type(item) == Tag:#判断是否是标签
# print('标签:',item)
# else:
# print('文本:',item)
4.。属性descendants,获取所有的子子孙孙的标签及其内容
# t4=soup.find('body')
# print(list(t4.descendants))
5.clear,将标签的所有子标签全部清空(保留标签名)
# t6=soup.find('div').clear()
# print(soup)
6.decompose,递归的删除所有的标签
# t7=soup.find('div')
# t7.decompose()
# print(soup)
7.extract,递归的删除所有的标签,并获取删除的标签
# t8=soup.find('div')
# print(t8.extract())#先是被删除的标签
8. 方法 decode,转换为字符串(含当前标签);decode_contents(不含当前标签)
# t9=soup.find('div')
# print(type(t9.decode()))
# print(t9.encode())#返回字节模式
9.方法 find,获取匹配的第一个标签
# t10=soup.find('div')
#print(t10)
# t11 = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')#是否在子孙标签中查找
# t12=soup.find(name='a', attrs={'class': 'sister'}, recursive=False, text='Lacie')
# print(t12)
10.方法 find_all()获取匹配的所有标签
# t11=soup.find_all('a')
#print(t11)
# t11=soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
# print(t11)
#列表
# t11=soup.find_all(['div','a'])#查找标签为div或a的
# print(t11)
#t11=soup.find_all(class_=['title','story'])#查找class属性为title或story的
#print(t11)
#正则
# import re
# rep=re.compile('^p')
# t12=soup.find_all(rep)
# print(t12)
11.get()方法获取标签属性值
# t13=soup.find('p')
# print(t13.get('class'))
12. has_attr()方法,检查标签是否具有该属性
# t14=soup.find('p')
# print(t14.has_attr('name'))
13.get_text()方法,获取标签文本信息
t15=soup.find('p')
print(t15.get_text())
14.index方法,检查标签在某标签中的索引位置
# tar=soup.find('div')
# print(tar)
# print(len(tar))
# print(tar.index(tar.find('h1')))
# for i,v in enumerate(tar):
# print(i,v)
15is_empty_element属性,是否是自闭合标签
#tar=soup.find('img')
tar=soup.find('div')
print(tar.is_empty_element)
16。属性,找出当前标签的关联标签
# soup.next 查找下一个标签 # soup.next_element # soup.next_elements # soup.next_sibling # soup.next_siblings # # tag.previous # tag.previous_element # tag.previous_elements # tag.previous_sibling # tag.previous_siblings # # tag.parent # tag.parents
1 from bs4.element import Tag 2 # tar=soup.find(class_='story') 3 #print(list(tar.next_elements))#找出所有跟自己有关系的标签及其内容包括自己的子标签 4 # print('\n') 5 # for i in tar.next_elements: 6 # if type(i)==Tag: 7 # print(i) 8 #print(list(tar.next_siblings))#找出所有跟自己有关系的标签机器,不包括自己的子标签 9 #print(list(tar.previous)) 10 #print(list(tar.previous_elements))#从上面找出跟自己像相关的标签及其内容,包括body和html标签 11 #print(list(tar.previous_siblings))#从上面找处更自己相关的标签,不包括body,html标签 12 tar=soup.find(id='link3') 13 # print(tar.parent)#找出父亲 14 # print((tar).parent.name) 15 # print(list(tar.parents))#找出父亲及其以上备份的 16 # for i in tar.parents: 17 # print(i.name) 18 19 #print(list(tar.next_siblings))#找出所有跟自己有关系的标签机器,不包括自己的子标签 20 #print(list(tar.previous_siblings))#从上面找处更自己相关的标签,不包括body,html标签 21 # print(tar.parent)#找出父亲
17.方法,查找某标签的关联标签
######和上面查找的内容一样,只不过是可以指定查找的下一个上一个的条件
# tag.find_next(...)
# tag.find_all_next(...)
# tag.find_next_sibling(...)
# tag.find_next_siblings(...)
# tag.find_previous(...)
# tag.find_all_previous(...)
# tag.find_previous_sibling(...)
# tag.find_previous_siblings(...)
# tag.find_parent(...)
# tag.find_parents(...)
# tar=soup.find(class_='story')#朝朝class为story的标签
# x=tar.find_next('p')并且朝朝下一个标签为p的标签
# print(x)
18.select,select_one, CSS选择器语法
soup.select("title")
soup.select("p nth-of-type(3)")
soup.select("body a")
soup.select("html head title")
tag = soup.select("span,a")
soup.select("head > title")
soup.select("p > a")
soup.select("p > a:nth-of-type(2)")
soup.select("p > #link1")
soup.select("body > a")
soup.select("#link1 ~ .sister")
soup.select("#link1 + .sister")
soup.select(".sister")
soup.select("[class~=sister]")
soup.select("#link1")
soup.select("a#link2")
soup.select('a[href]')
soup.select('a[href="http://example.com/elsie"]')
soup.select('a[href^="http://example.com/"]')
soup.select('a[href$="tillie"]')
soup.select('a[href*=".com/el"]')
from bs4.element import Tag
def default_candidate_generator(tag):
for child in tag.descendants:
if not isinstance(child, Tag):
continue
if not child.has_attr('href'):
continue
yield child
tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator)
print(type(tags), tags)
from bs4.element import Tag
def default_candidate_generator(tag):
for child in tag.descendants:
if not isinstance(child, Tag):
continue
if not child.has_attr('href'):
continue
yield child
tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator, limit=1)
print(type(tags), tags)
19.string属性,获取标签的内容
tar=soup.find('body')
# print(tar.string)
# tar.string='this is my web'
# print(soup)
#print(list(tar.stripped_strings))#获取该标签下的所有文本信息
20.append()方法,在当前标签内部追加一个标签
from bs4.element import Tag
obj = Tag(name='p',attrs={'id': 'it'})#创建一个标签
obj.string='i am new element'
tar.append(obj)#在find的标签中末尾添加一个标签
print(soup)
21.insert方法,在当前标签内部指定位置插入一个标签
tag=Tag(name='input',attrs={"type":'button'})
tag.string="点击"
tar=soup.find('div')
tar.insert(2,tag)#在2的位置插入tag标签
print(soup)
22. insert_after(),insert_before()方法, 在当前标签后面或前面插入
# from bs4.element import Tag
# obj = Tag(name='i', attrs={'id': 'it'})
# obj.string = '我是一个新来的'
# tag = soup.find('body')
# # tag.insert_before(obj)
# tag.insert_after(obj)
# print(soup)
23.replace_with 在当前标签替换为指定标签
tag=Tag(name='input',attrs={"type":'button'})
tar=soup.find('b')
tar.replace_with(tag)#将find的标签替换为该标签
print(soup)
24.wrap,将指定标签把当前标签包裹起来
tag=Tag(name='input',attrs={"type":'button'})
tar=soup.find('p')
tar.wrap(soup.find('img'))#将原有的标签移动到tar的外面
# print(list(tar.parents))
# tar.wrap(tag)#使tag吧tar包住
print(soup)
25.unwrap(),去掉当前标签,将保留其包裹的标签
tar=soup.find('a')
tar.unwrap()#之江find的标签移除,不包括其内容和子标签
print(soup)
四:获取汽车之家信息
import requests
import uuid
from bs4 import BeautifulSoup
response=requests.get(url="https://www.autohome.com.cn/news/")
response.encoding=response.apparent_encoding#设置编码
soup=BeautifulSoup(response.text,features='html.parser')#将request请求的html文本生成一个beautifulsoup对象
target=soup.find(id='auto-channel-lazyload-article')#查找id=auto-channel-lazyload-article的标签及其子标签
li_list=target.find_all('li')#查找有的li标签及其子标签,生成的是一个列表
for item in li_list:
a=item.find('a')
if a:
print(a.attrs.get('href')) # 找到a对象所有的属性
b = a.find('img')
print(b.attrs.get('src'))
c=a.find('h3').text#加text返回的是文本类型,反之是一个标签对象
print(c,type(c))
img_url=a.find('img').attrs.get("src")
img_response=requests.get(url='http:'+img_url)
file_name=str(uuid.uuid4())+'.jpg'
with open(file_name,'wb') as f:
f.write(img_response.content)

浙公网安备 33010602011771号