Spider爬虫基础

get获取某个网站的html代码,post访问网站获取网站返回的信息

import urllib.request
import urllib.parse
#使用get请求
def start1():
    response=urllib.request.urlopen('http://www.baidu.com')
    print(response.read().decode('utf-8'))
#使用post请求
def start2():
    data=bytes(urllib.parse.urlencode({'dsadasdas':'杀马特'}),encoding='utf8')
    #使用uillib.parse来将想发送的表单的键值对按照utf8弄成适合网页post传输的形式
    response=urllib.request.urlopen('http://httpbin.org/post',data=data)
    print(response.read().decode('utf-8'))
start2()

设置访问超时处理

import urllib.request
import urllib.parse

try:
    response=urllib.request.urlopen('http://www.baidu.com',timeout=0.01)
    print(response.read().decode('utf-8'))
except urllib.error.URLError as e:
    print('time out')

获取状态码等

import urllib.request
import urllib.parse

response=urllib.request.urlopen('http://www.baidu.com')
print(response.getheader) #获取请求的信息头
print(response.status) #获取请求的状态码
response=urllib.request.urlopen('http://douban.com')
print(response.status) #出现418状态码表示自己被发现是爬虫了

通过发送头部来伪装浏览器,突破豆瓣

import urllib.request
import urllib.parse

url1='http://www.douban.com'
sendheader= {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.67"
}
req=urllib.request.Request(url=url1,headers=sendheader)
response=urllib.request.urlopen(req)
print(response.read().decode('utf-8'))

beatifulsoup4的使用

bs4可以将复杂的html文档转换成一个复杂的树形结构,每个节点都是python对象,所有的对象可以归纳成4种

-Tag

-NavigableString

-Comment

文档的便利,文档的搜索,css选择器

import urllib.request
import urllib.parse
import re
from bs4 import BeautifulSoup

file = open('baidu.html','rb')
html=file.read().decode('utf8')
bs=BeautifulSoup(html,'html.parser')
#1.tag 标签及其内容
print(bs.title)  #打印title标签
print(bs.title.string) #打印title里面的字符串内容
print(bs.a.attrs)  #拿到标签里面的属性放进字典

#comment 是注释,输出的内容不包括注释符号
#----------文档的便利——---------
print('contents用于遍历某个标签里面的节点放进一个列表',bs.head.contents)
print('可以获取列表里面的某一个值',bs.head.contents[0])
#----------文档的搜索——---------
t_list=bs.find_all('a')
#下面这种是字符串过滤,会找完全匹配的内容
print('找所有的a标签放进列表',t_list)
#下面这种是正则表达式过滤
t_list1=bs.find_all(re.compile('a'))
print('正则找含有a的标签',t_list1)
#还有根据函数(来返回)过滤
def name_exist(tag):
    return tag.has_attr('name')
t_list=bs.find_all(name_exist)
print('找出属性中有name的',t_list)

t_list=bs.find_all(id='head')
print('找id等于head的',t_list)

t_list=bs.find_all(text='百度首页')
print('找文本等于百度首页的',t_list)
#----------css选择器——---------
t_list=bs.select('title') #按照标签查找
print(t_list)
t_list=bs.select('.bdsug') #按照css类查找
print(t_list)
t_list=bs.select('#u1') #按照css的id查找
print(t_list)
t_list=bs.select('head > title') #按照head下面的title查找
print(t_list)
t_list=bs.select('.sda ~ .mm') #找和.sda同一级的.mm 兄弟节点
print(t_list)
t_list=bs.select('div',class_='item') #找div且class是item的。
print(t_list)

保存数据进入xls数据库

import xlwt
workbook=xlwt.Workbook(encoding='utf8',style_compression=0)  #创建表对象
worksheet=workbook.add_sheet('sheet1',cell_overwrite_ok=True)  #创建工作表,cell_overwrite_ok=True要写,用于后面写的覆盖前面的
worksheet.write(0,0,'hello')  #写入数据,第一参数是行,第二个参数是列,第三个参数是内容
col=('链接','图片','关键字')
for i in range(0,3):
    worksheet.write(1,i,col[i])
workbook.save('student.xls')

sqlite数据库的使用

import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
sql='''
create table company
    (id int primary key not null,
    name text not null,
    age int not null,
    address char(50),
    salary real)
'''
#create table company是创建company的表格
# 下面用括号代表它这个表格里面的内容,首先是id,id是整型且是主键,not nuall是非空
# address char(50)地址是50的字符串  salary是real形的数据

sql1='''
insert into company (id,name,age,address,salary)
values(1,'十大',30,'sjsad',15000)

'''

c.execute(sql) #执行sql语句,建表
c.execute(sql1) #执行sql语句,插入
sql3='select id,name,address,salary from company'
#-------以下为查询操作------
cursor=c.execute(sql3)
for row in cursor:
    print('id',row[0])
    print('name',row[1])
    print('address',row[2])
    print('salary',row[3])
    print('\n')
    # -------以上为查询操作------
conn.commit()  #提交数据库操作
conn.close()    #关闭数据库连接
print('成功建表')
#数据类型  文本text 整形int 字符串型varchar  含小数型numeric
#autoincrement自增长)

 

posted @ 2020-11-09 21:37  克莱比-Kirby  阅读(171)  评论(0)    收藏  举报