পাইথন 3 ওয়েব স্ক্র্যাপিংয়ে এইচটিটিপি ত্রুটি 403


103

আমি অনুশীলনের জন্য একটি ওয়েবসাইট স্ক্র্যাপ করার চেষ্টা করছিলাম, তবে আমি এইচটিটিপি ত্রুটি 403 পেয়ে যাচ্ছি (এটি কি আমি বট মনে করি)?

আমার কোডটি এখানে:

#import requests
import urllib.request
from bs4 import BeautifulSoup
#from urllib import urlopen
import re

webpage = urllib.request.urlopen('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1').read
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')

row_array = re.findall(findrows, webpage)
links = re.finall(findlink, webpate)

print(len(row_array))

iterator = []

আমি যে ত্রুটি পেয়েছি তা হ'ল:

 File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python33\lib\urllib\request.py", line 479, in open
    response = meth(req, response)
  File "C:\Python33\lib\urllib\request.py", line 591, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python33\lib\urllib\request.py", line 517, in error
    return self._call_chain(*args)
  File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
    result = func(*args)
  File "C:\Python33\lib\urllib\request.py", line 599, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

উত্তর:


221

এটি সম্ভবত এমন mod_securityকোনও অনুরূপ সার্ভার সুরক্ষা বৈশিষ্ট্যের কারণে যা জানা স্পাইডার / বট ব্যবহারকারী এজেন্টদের অবরুদ্ধ করে ( urllibএমন কিছু ব্যবহার করে যা python urllib/3.3.0এটি সহজেই সনাক্ত করা যায়)। এটির সাথে পরিচিত ব্রাউজার ব্যবহারকারী এজেন্ট সেট করার চেষ্টা করুন:

from urllib.request import Request, urlopen

req = Request('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1', headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()

এটি আমার পক্ষে কাজ করে।

উপায় দ্বারা, আপনার কোড আপনি অনুপস্থিত ()পর .readurlopenলাইন, কিন্তু আমি মনে করি যে এটা একটা টাইপো আছে।

টিপ: যেহেতু এটি অনুশীলন, তাই একটি আলাদা, অ-নিষেধাজ্ঞামূলক সাইট চয়ন করুন। তারা urllibকোনও কারণে অবরুদ্ধ হচ্ছে ...


আমি ধরে নিয়েছি এটি reqএকাধিক urlopenকলের জন্য পুনরায় ব্যবহার করা নিরাপদ ।
একিউম্যানাস

এটি হতে পারে দেরি হতে পারে, তবে আমার কোডটিতে ইতিমধ্যে আমার ব্যবহারকারীর এজেন্ট রয়েছে, এটি এখনও আমাকে দেয়Error 404: Access denied
রিমা পরখ

এটি কাজ করে তবে আমার কাছে মনে হচ্ছে বটগুলি ব্লক করার জন্য তাদের অবশ্যই যুক্তিসঙ্গত কারণ থাকতে হবে এবং আমি তাদের পরিষেবার শর্তাদি লঙ্ঘন করছি
xjcl

39

ব্যবহারকারী এজেন্টের উপর ভিত্তি করে আপনার urllib ব্যবহারের কারণে এটি অবশ্যই অবরুদ্ধ। এই একই জিনিস আমার সাথে অফারআপের সাথে ঘটছে। আপনি অ্যাপ্লায়োলোপেনার নামে একটি নতুন শ্রেণি তৈরি করতে পারেন যা মজিলার সাথে ব্যবহারকারী-এজেন্টকে ওভাররাইড করে।

import urllib.request

class AppURLopener(urllib.request.FancyURLopener):
    version = "Mozilla/5.0"

opener = AppURLopener()
response = opener.open('http://httpbin.org/user-agent')

সূত্র


4
শীর্ষ উত্তর আমার পক্ষে কাজ করে না, যখন আপনার কাজটি করেছিল। অনেক ধন্যবাদ!
তরুণ উদয়

এটি কেবল সূক্ষ্মভাবে কাজ করে তবে এর সাথে আমার এসএসএল কনফিগারেশন সংযুক্ত করা দরকার। আমি এটা কিভাবে করবো? আমি এটি দ্বিতীয় প্যারামিটার হিসাবে যুক্ত করার আগে (urlopen (অনুরোধ, প্রসঙ্গ = ctx))
হউক

4
দেখে মনে হচ্ছে এটি খুলেছে তবে এটি বলেছে 'ভ্যালুরইরার: বন্ধ ফাইলটি পড়া'
মার্টিয়ান2049

@ জেটা আপনি কীভাবে অফারআপকে স্ক্র্যাপ করতে এবং কোনও স্ক্রিপ্ট থেকে অনুসন্ধান সম্পাদনের জন্য প্রয়োজনীয় জিও কোঅর্ডিনেটগুলি সরবরাহ করেছেন?
সিজে ট্র্যাভিস

@ সিজেট্রাভিস, আমি অফারআপ স্ক্র্যাপিং করছিলাম না। আমি কেবল একটি আইটেমের সঠিক URL এর উপর ভিত্তি করে আইটেমের মানগুলি উদ্ধার করছি। এটা আমার জন্য কোনো ভৌগোলিক স্থানাঙ্ক প্রয়োজন হয়নি
জিটা

14

"এটি সম্ভবত মোড_সিকিউরিটির কারণে বা কোনও অনুরূপ সার্ভার সুরক্ষা বৈশিষ্ট্যের কারণে যা ব্লক হিসাবে পরিচিত

মাকড়সা / বট

ব্যবহারকারী এজেন্ট (urllib পাইথন urllib / 3.3.0 এর মতো কিছু ব্যবহার করে, এটি সহজেই সনাক্ত করা যায়) "- যেমনটি ইতিমধ্যে স্টেফানো সানফিলিপো উল্লেখ করেছেন

from urllib.request import Request, urlopen
url="https://stackoverflow.com/search?q=html+error+403"
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})

web_byte = urlopen(req).read()

webpage = web_byte.decode('utf-8')

Web_byte সার্ভার এবং ওয়েব পেজ এ বিষয়বস্তুর প্রকার বর্তমান দ্বারা ফিরে একটি বাইট অবজেক্ট বেশিরভাগই হয় UTF-8 । অতএব আপনি ওয়েব_বাইট ডিকোড করা প্রয়োজন ব্যবহার করে ।

আমি পাইচার্ম ব্যবহার করে কোনও ওয়েবসাইট থেকে স্ক্র্যাপ করার চেষ্টা করার সময় এটি সম্পূর্ণ সমস্যার সমাধান করে

PS -> আমি অজগর ব্যবহার করি 3.4


3

পূর্ববর্তী উত্তরের ভিত্তিতে,

from urllib.request import Request, urlopen       
#specify url
url = 'https://xyz/xyz'
req = Request(url, headers={'User-Agent': 'XYZ/3.0'})
response = urlopen(req, timeout=20).read()

সময়সীমা বাড়াতে এটি আমার পক্ষে কাজ করেছিল।


2

যেহেতু পৃষ্ঠাটি ব্রাউজারে কাজ করে এবং পাইথন প্রোগ্রামের মধ্যে কল করার সময় নয়, মনে হয় যে ওয়েব অ্যাপ্লিকেশনটি সেই ইউআরএল পরিবেশন করে তা আপনি ব্রাউজারের দ্বারা নয় এমন সামগ্রীর জন্য অনুরোধ করেছেন।

প্রদর্শন:

curl --dump-header r.txt http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1

...
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
You don't have permission to access ...
</HTML>

এবং r.txt এ থাকা সামগ্রীর স্থিতি রেখা রয়েছে:

HTTP/1.1 403 Forbidden

হেডার 'ব্যবহারকারী-এজেন্ট' পোস্ট করার চেষ্টা করুন যা ওয়েব ক্লায়েন্টকে নকল করে

দ্রষ্টব্য: পৃষ্ঠাটিতে অ্যাজাক্স কল রয়েছে যা সারণীটি তৈরি করে যা আপনি সম্ভবত বিশদ করতে চান। টেবিলের সামগ্রী পেতে আপনাকে কোন ইউআরএল কল করতে হবে তা দেখতে আপনাকে পৃষ্ঠার জাভাস্ক্রিপ্ট যুক্তি পরীক্ষা করতে হবে বা ব্রাউজার ডিবাগার (ফায়ারবগ / নেট ট্যাব এর মতো) ব্যবহার করতে হবে।


1

আপনি দুটি উপায়ে চেষ্টা করতে পারেন। বিস্তারিত এই লিঙ্কে

1) পিপ মাধ্যমে

পাইপ ইনস্টল - আপগ্রেড সার্টিফি

২) যদি এটি কাজ না করে তবে একটি সার্টিফিকেট.কম-এ চালানোর চেষ্টা করুন যা পাইথন with. এর সাথে বান্ডিল হয়ে আসে * * ম্যাকের জন্য: (আপনার পাইথন ইনস্টলেশন স্থানে যান এবং ফাইলটিতে ডাবল ক্লিক করুন)

ওপেন / অ্যাপ্লিকেশন / পাইথন \ 3। * / ইনস্টল করুন ates সার্টিফিকেট.কম


1

আপনি যদি মজিলা হিসাবে ব্যবহারকারী-এজেন্টকে নকল করার বিষয়ে দোষী মনে করেন (স্টেফানো থেকে শীর্ষ উত্তরে মন্তব্য করুন) তবে এটি কোনও নন-ইউরালিব ব্যবহারকারী-এজেন্টের সাথেও কাজ করতে পারে। এটি আমি উল্লেখ করা সাইটগুলির জন্য কাজ করেছে:

    req = urlrequest.Request(link, headers={'User-Agent': 'XYZ/3.0'})
    urlrequest.urlopen(req, timeout=10).read()

আমার আবেদনটি আমার নিবন্ধগুলিতে উল্লেখ করা নির্দিষ্ট লিঙ্কগুলি স্ক্র্যাপ করে বৈধতার পরীক্ষা করা। জেনেরিক স্ক্র্যাপ নয়।


1

পূর্ববর্তী উত্তরের উপর ভিত্তি করে এটি পাইথন ৩.7 এর সাথে আমার পক্ষে কাজ করেছে

from urllib.request import Request, urlopen

req = Request('Url_Link', headers={'User-Agent': 'XYZ/3.0'})
webpage = urlopen(req, timeout=10).read()

print(webpage)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.