ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分享一个简单的爬虫案例

2022-01-10 12:03:42  阅读:84  来源: 互联网

标签:__ cur re 爬虫 案例 book import 分享 data


最近决定冲击一下python的爬虫,爬取的目标是https://book.douban.com/top250,非常简单,但是呢?因为频繁的请求导致被网站制裁了,我的ip被封了。=-=。。。。,怎么办呢?换个ip就行了呀?因为俺是面向百度编程,通过一顿搜索之后,解决ip被封的答案就是建立一个ip代理池,通过获取网上的白嫖ip来访问要爬取的页面,但由于能力不够,加上有点懒,我找到了一个github开源项目!GitHub - Python3WebSpider/ProxyPool: An Efficient ProxyPool with Getter, Tester and Servericon-default.png?t=LBL2https://github.com/Python3WebSpider/ProxyPool       这是地址!

下面分享爬虫源码用的数据库是sqlite3

import time
# import urllib.request,urllib.error 
import requests
# tips 这里我之前用的是urllib.request,但后来发现requests好用点
from bs4 import BeautifulSoup
import sqlite3
import re
def main():
    Url = 'https://book.douban.com/top250?start='
    data = getText(Url)
    savepath = 'book.sql'
    save(data,savepath)
text = re.compile(r'<a .*title="(.*?)">.*?</a>',re.S)
img = re.compile(r'<img src="(.*?)" .*>.*',re.S)
details = re.compile(r'<p class="pl">(.*?)</p>',re.S)
def getText(Url):
    data = []
    for i in range(0,10):
        url = Url+ str(i*25)
        html = askURL(url)
        soup = BeautifulSoup(html,'html.parser')
        for item in soup.find_all('tr',class_="item"):
            d = []
            item = str(item)
            txt = re.findall(text,item)
            imgs = re.findall(img,item)
            detail = re.findall(details,item)
            d.append(''.join(txt))
            d.append(''.join(imgs))
            d.append(''.join(detail))
            data.append(d)
    return data
def askURL(Url):
    head = {
        'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
    }
    proxies = {'http': 'ip:端口'} #这里是代理ip
    req = requests.get(Url,headers=head,proxies=proxies,timeout=10)
    html = req.text
    return html
def save(data,savepath):
    init_db(savepath)
    conn = sqlite3.connect(savepath)
    cur = conn.cursor()
    for data in data:
        for index in range(len(data)):
            if index == 4 or index ==5:
                continue
            data[index] = '"' + data[index]+'"'
        sql = '''
            insert into bookTop(
            book_name,pic_link,detail
            )values(%s)
        '''%",".join(data)
        cur.execute(sql)
        conn.commit()
    cur.close()
    conn.close()
def init_db(savepath):
    createSql = '''
        create table bookTop
        (
        id integer primary key autoincrement,
        book_name varchar,
        pic_link text,
        detail text 
        ) '''
    con = sqlite3.connect(savepath)
    cur = con.cursor()
    cur.execute(createSql)
    con.commit()
    con.close()
if __name__ == '__main__':
    print('hh')
    main()
    print('ok')

然后将它封装成接口用的是flask框架

import sqlite3
from flask import Flask,jsonify,request
from gevent import pywsgi
app = Flask(__name__)
@app.route('/getData', methods=['post']) #这里是请求路径和方法
def getData():
 con = sqlite3.connect('book.sql')
 cur = con.cursor()
 sql = 'select book_name,pic_link,detail from bookTop'
 data = []
 try:
    cur.execute(sql)
    book_all = cur.fetchall()
    for i in book_all:
        data.append(i)
 except Exception as e:
    print(e)
    print('查询失败')
 finally:
    cur.close()
    con.close()
 return jsonify(data)

if __name__ == '__main__':
    print('服务启动')
    server = pywsgi.WSGIServer(('0.0.0.0', 50), app)
    server.serve_forever()

前端我用electron创建了vue-cli,有兴趣可以马梓东/Vue electron - Gitee.com

 

标签:__,cur,re,爬虫,案例,book,import,分享,data
来源: https://blog.csdn.net/weixin_50515020/article/details/122407160

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有