Python与爬虫入门实践——简易搜狐新闻爬虫01

Python与爬虫入门实践——简易搜狐新闻爬虫01

写在前面:

笔者在寒假期间进行了一些简短的实训,主要内容包括简单的爬虫和简单的人脸识别算法,由于时间有限,对于python也是第一次详细学习,功能较为简单,提供给入学者参考,帮助大家进入py的世界,若有不正确或不明确的地方欢迎指正。

以下是一个简单爬虫项目所需要的基本内容,整体的项目代码参考另一片文章:

Python与爬虫入门实践——简易搜狐新闻爬虫02https://blog.csdn.net/gcn_Raymond/article/details/86756404

                                                                                                                                                                             

一、爬虫介绍

爬虫的基本原理

爬虫是什么?

从互联网中抓取数据的程序

搜索引擎

先准备一些网站---找到更多网站---搜集每个页面的数据---保存到服务器中(数据库)

爬虫本质是模拟浏览器访问网页的过程

HTTP/HTTPS

从网站服务器上获取页面,网页传输的是源代码/文件

网页中的三个元素

HTML超文本标记语言

节点上的数据

标签的属性

img、href标签

文本

特殊属性

Id、class

css

控制样式

JavaScript

事件驱动

ajax网页异步技术,网站的接口化又称前后端分离(页面相关的东西单独处理,数据由单独的接口提供Web API 数据格式:JSON格式/XML格式)

爬虫编写

获取源代码

网页中提取数据

HTTP状态码

状态码有助于我们判断编写的程序是否可以正常连接上指定网站

参考资料:

http://tools.jb51.net/table/http_status_code

二、爬虫编写

1.访问目标网站

urllib库提供了访问HTTP协议的工具

#urllib库提供了访问HTTP协议的工具
import urllib.request
from urllib import request

#获取一个站点的html源码
response=request.urlopen("https://www.qq.com/")
print(response.geturl())
print(response.info())
print(response.getcode())#得到状态码

结果如下:

 2.伪装请求头

有时候请求头会被网站识别,他会拒绝我们访问,这是网站的反爬机制,我们只要伪装一下,装作我们是普通用户就可以通过检测了

from urllib import request
from urllib.request import Request
#beautifulsoup
url='http://httpbin.org/get'
#伪装请求头
headers={'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

req=Request(url, headers=headers)

response=request.urlopen(req)
print(response.read().decode('utf-8'))

3.安装beautifulsoup

beautifulsoup可以帮助我们提取网页中html标签,来进一步提取我们想要的元素

pip install beautifulsoup4

 安装完成后可以看到新的包出现

4.爬取新闻标题和内容

查询标题

from urllib import request
from urllib.request import Request
from bs4 import BeautifulSoup
url='http://www.sohu.com/a/289547597_114731?g=0?code=61f919a88328210f408c3e188c241d16'

headers={'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}

req=Request(url, headers=headers)

response=request.urlopen(req)

soup = BeautifulSoup(response.read(),'html.parser')
print(soup.h1)#元素选择器
#信息的获取
print(soup.h1.name)#标签名
print(soup.title.string)#标签内的字符串
h1=soup.h1
#去掉空格、换行
print(h1.contents[0])#
newstitle = h1.contents[0]
newstitle=newstitle.replace(' ','')
newstitle=newstitle.replace('\n','')
print(newstitle)

查询内容

article=soup.article
ps=article.contents
#遍历子节点,筛选文字信息
for p in ps:
    if p.string:
        print(p.string)

 

这是对于一个新闻内容页的爬取:http://www.sohu.com/a/289547597_114731?g=0?code=61f919a88328210f408c3e188c241d16

5.爬取信息保存数据库

这里用到的是sqlite数据库

保存收集的数据

1.保存到文件中

文本csv json 保存方便,查询不便

2.保存到服务器

可以保存海量数据

3.保存到数据库中

查询方便,速度快

sqlite数据库

基于文件

创建emp

emp

id 自增主键

name 文本

sex 文本

#创建数据库
import sqlite3
#数据库的连接,参数:数据库文件的名字,如果文件不存在,自动创建文件
conn=sqlite3.connect('mydb.db')
#创建数据表 执行一段sql
#创建执行对象
cor=conn.cursor()
#调用执行对象
cor.execute('''
    create table emp(
        id INTEGER  PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        sex TEXT NOT NULL
    )
''')
#提交
conn.commit()
#关闭数据库连接
conn.close()

 

有绿色箭头的DB按钮是同步刷新,有时出现数据库结果和实际结果不一致的时候可以刷新一下试试

有关数据库的详细代码如下:

#创建数据库
import sqlite3
#数据库的连接,参数:数据库文件的名字,如果文件不存在,自动创建文件
def creat_table():
    conn=sqlite3.connect('mydb.db')
    #创建数据表 执行一段sql
    #创建执行对象
    cor=conn.cursor()
    #调用执行对象
    cor.execute('''
        create table emp(
            id INTEGER  PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            sex TEXT NOT NULL
        )
    ''')
    #提交
    conn.commit()
    #关闭数据库连接
    conn.close()
#增删改查
def add():
    conn = sqlite3.connect('mydb.db')
    cor = conn.cursor()
    cor.execute('''
        insert into emp 
        (name, sex)
        values 
        ('赵四','男')
    ''')
    conn.commit()
    conn.close()
# if __name__=='__main__':
#     add()
def query():
    conn = sqlite3.connect('mydb.db')
    cor = conn.cursor()
    result=cor.execute('''
            select * from emp
        ''')
    ls=[]
    for row in result:
        # print(row[0])
        # print(row[1])
        # print(row[2])
        ls.append(row)
    #print(result)
    conn.commit()
    return ls
    conn.close()
if __name__=='__main__':
    ls = query()
    for row in ls:
        print(row)
#删除语句delete from emp where id=1
#修改语句update emp set name='xiaoma',sex='女'

猜你喜欢

转载自blog.csdn.net/gcn_Raymond/article/details/86741843