Python爬虫脚本,利用find爬取普通网页(源码)

本文介绍了一种利用Python中的BeautifulSoup库和Oracle数据库进行网页数据抓取的方法,重点在于从特定网站抓取全国及山东省的农产品价格信息,并将其存储到Oracle数据库中。通过构造URL和使用requests库发送HTTP请求,再结合BeautifulSoup解析HTML,实现了自动化数据抓取。此外,还介绍了如何使用uuid生成唯一标识符,并批量插入数据到数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BeautifulSoup+ Find + Oracle爬取

不想存库的话直接用CSV做成表格数据也是可以的,方便了上班族

# 全国城市
import requests
from bs4 import BeautifulSoup
import cx_Oracle
import os
import uuid 
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}  # 爬虫[Requests设置请求头Headers],伪造浏览器
# 核心爬取代码 
conn = cx_Oracle.connect('username/password@127.0.0.1:1521/orcl')
print("数据库连接上了")

cursor_oracle = conn.cursor()
sql = "select PARAKEY from BASEDATA WHERE PARACODE=" + "'vagetable'"
cr = conn.cursor()
cr.execute(sql)  # 执行sql语句
fenlei = []
rs = cr.fetchall()  # 一次返回所有结果集

for (row,) in rs: 
    # 去掉括号,放入数组
    fenlei.append(row)
    
print(fenlei)
num = 0
url = 'http://nong.gold600.com/cx?pz=';
# 山东URL
shanUrl = []
# 全国URL
allUrl = []
for k in fenlei:
# 这个是在for循环外面的,就是将列表的元素之间用&符号连接起来
    aa = url + k + '&c=shandong'
    cc = url + k
    
    shanUrl.append(aa)
    allUrl.append(cc)
    
    for i in range(2, 11):
        bb = aa + '&page=' + str(i)
        dd = cc + '&page=' + str(i)
        shanUrl.append(bb)
        allUrl.append(dd)
        
# 循环全国打印url
for url in allUrl:
    print(url)
    response = requests.get(url, headers=headers)  # 访问url
    soup = BeautifulSoup(response.text, 'html.parser')  # 获取网页源代码
    # 获取数据
    tr = soup.find('table', class_='bx').find_all('tr')  # .find定位到所需数据位置  .find_all查找所有的tr(表格)
    # 去除标签栏
    for j in tr[1:]:  # tr2[1:]遍历第1列到最后一列,表头为第0列
        TTID = str(uuid.uuid1())
        td = j.find_all('td')  # td表格
        Name = td[0].get_text().strip()  # 遍历名称
        Price = td[1].get_text().strip()  # 遍历价格
        AQI = td[2].get_text().strip()  # 遍历单位
        Market = td[3].get_text().strip()  # 遍历批发市场
        Timme = td[4].get_text().strip()  # 遍历时间
        Code = '0'
        sql = "insert into PRODUCTPRICE(ID,NAME,PRICE,UNIT,AREA,INDATE,CODE) values ('" + TTID + "','" + Name + "','" + Price + "','" + AQI + "','" + Market + "','" + Timme + "','" + Code + "')"
        cursor_oracle.execute(sql)
        num = num + 1
        if(num > 100):
            conn.commit()
            num = 0
# 循环山东打印url
for url in shanUrl:
    print(url)
    response = requests.get(url, headers=headers)  # 访问url
    soup = BeautifulSoup(response.text, 'html.parser')  # 获取网页源代码
    # 获取数据
    tr = soup.find('table', class_='bx').find_all('tr')  # .find定位到所需数据位置  .find_all查找所有的tr(表格)
    # 去除标签栏
    for j in tr[1:]:  # tr2[1:]遍历第1列到最后一列,表头为第0列
        TTID = str(uuid.uuid1())
        td = j.find_all('td')  # td表格 
        Name = td[0].get_text().strip()  # 遍历名称
        Price = td[1].get_text().strip()  # 遍历价格
        AQI = td[2].get_text().strip()  # 遍历单位
        Market = td[3].get_text().strip()  # 遍历批发市场
        Timme = td[4].get_text().strip()  # 遍历时间
        Code = '1'
        sql = "insert into PRODUCTPRICE(ID,NAME,PRICE,UNIT,AREA,INDATE,CODE) values ('" + TTID + "','" + Name + "','" + Price + "','" + AQI + "','" + Market + "','" + Timme + "','" + Code + "')"
        cursor_oracle.execute(sql)
        num = num + 1
        if(num > 100):
            conn.commit()
            num = 0
conn.commit()
cursor_oracle.close()
conn.close()

### 如何用 Python 爬虫抓取豆瓣网页内容 #### 使用 Requests 和 BeautifulSoup 进行数据采集 为了实现从豆瓣网站上抓取数据的任务,可以利用 `requests` 库发送 HTTP 请求并获取目标页面的内容,再借助 `BeautifulSoup` 解析 HTML 文档提取所需的信息。以下是具体方法: 1. **安装必要的库** 需要先确保已安装所需的第三方库 `requests` 和 `bs4`(即 BeautifulSoup)。可以通过以下命令安装这些依赖项[^3]: ```bash pip install requests bs4 ``` 2. **发送 HTTP 请求** 利用 `requests.get()` 方法向目标 URL 发起 GET 请求以获取响应对象。随后调用 `.text` 属性读取返回的 HTML 页面源码。 ```python import requests url = 'https://movie.douban.com/top250' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'} response = requests.get(url, headers=headers) html_content = response.text ``` 3. **解析 HTML 并提取数据** 创建一个 `BeautifulSoup` 对象传入上述获得的 HTML 字符串以及指定解析器类型(推荐 lxml),之后便可按照标签名称或者 CSS 选择器定位到特定节点进而抽取其内部文字或其他属性值。 ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'lxml') movie_list = [] for item in soup.select('.item'): title = item.find('span', class_='title').get_text() rating_num = float(item.find('span', class_='rating_num').get_text()) movie_info = { 'Title': title, 'Rating': rating_num } movie_list.append(movie_info) ``` 4. **应对反爬机制** 当前许多主流站点都会采取一定措施防止被恶意爬取,比如设置访问频率限制、验证身份合法性等等。针对这种情况,在构建请求头时加入模拟浏览器行为的相关字段是非常重要的一步;另外还可以考虑引入代理 IP 或者延时操作等方式降低触发防护策略的风险。 #### 示例代码总结 下面给出完整的示例脚本供参考: ```python import time from random import randint import requests from bs4 import BeautifulSoup def fetch_douban_movies(): base_url = 'https://movie.douban.com/top250?start=' all_movies = [] user_agent = ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3)' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome') custom_headers = {"User-Agent": user_agent} start_index = 0 while True: current_page_url = f"{base_url}{start_index}" resp = requests.get(current_page_url, headers=custom_headers) if not resp.ok or '<div id="content">' not in resp.text: break parsed_html = BeautifulSoup(resp.content.decode(), features="html.parser") items = parsed_html.findAll("div", attrs={"class":"hd"}) titles_and_links = [(i.a.span.string.strip(), i.parent['href']) for i in items] all_movies.extend(titles_and_links) sleep_time = randint(1, 3) print(f"Sleeping {sleep_time} seconds before next request...") time.sleep(sleep_time) start_index += 25 return all_movies if __name__ == "__main__": movies_data = fetch_douban_movies() with open('./douban_top250.txt', mode='w+', encoding='utf8') as file_handler: for idx, record in enumerate(movies_data): rank = str(idx + 1).zfill(len(str(len(movies_data)))) line_to_write = "{}\t{}\n".format(rank, "\t".join(record)) file_handler.write(line_to_write) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值